看板 CSSE 關於我們 聯絡資訊
※ 引述《irene6524 (Irene)》之銘言: : 1.#include <stdio.h> : #include <stdlib.h> : int main(void) : { : int a=11,b=11; : a+=a+=b+=b%=b<<2; : printf(" %d ", a ); : system("pause"); : return 0; : } : 為甚麼答案是66? 是不是計算過程是 : a=a+a=a+b=b%b<<2 然後運算順序% << + =(右到左) : a=22=22=22=0 ,,a=0; : 推 LPH66:第一題是哪裡考的題目...爛透了 07/20 19:32 : → LPH66:這個式子是未定義行為 會得出什麼都有可能 07/20 19:33 : → LPH66:第二題我的答案跟你一樣是 6 07/20 19:35 : 推 micklin:同樓上. 07/21 00:36 : → chienweichih:第二題把marco打開是 printf("%d\n",(6));喔 多了兩 07/21 07:38 : → chienweichih:個刮號 07/21 07:38 : ※ 編輯: irene6524 來自: 180.206.152.8 (07/22 15:09) : → irene6524:第一題補上定義了,第二題是答案錯了嗎? 07/22 15:13 : 推 m87145999:第一題應該是,b=b%44(這44是從b<<2),然後b+=b,a+=b,a+=a 07/23 20:21 : 推 LPH66:第一題不管怎麼補都是未定義行為 07/25 21:38 : 推 LPH66:唔, 我好像有弄錯...來查一下標準 @@ 07/25 21:45 OK, 應該確定了一件事 這式子仍然是未定義行為 只不過正好我所知的兩種行為得到的結果是一樣的 問題在於這行程式在一個運算式之中對變數 a 跟 b 修改了兩次以上 這會導致未定義行為 只不過這個式子裡有所差別的地方計算出來的結果碰巧是一樣的而已 (有所差別的例子可以看 #1Deo3lyi (C_and_CPP) 那裡談的是一個在許多地方都流傳過的寫法 但因為觸發了未定義行為的關係 所以有時候產生的結果不如所想) -- 'Oh, Harry, don't you see?' Hermione breathed. 'If she could have done one thing to make absolutely sure that every single person in this school will read your interview, it was banning it!' ---'Harry Potter and the order of the phoenix', P513 -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 114.41.39.41
irene6524:好專業,謝謝~ 08/01 17:26