4.2 使用我的編譯器,下面的代碼  int i=7; printf("%d\n", i++ * i++); 返回 49?不管按什麼順序計算, 難道不該打印出56嗎?

儘管後綴自加和後綴自減操作符 ++ 和 -- 在輸出其舊值之後 才會執行運算, 但這裡的``之後"常常被誤解。沒有任何保證 確保自增或 自減會在輸出變量原值之後和對表達式的其它部分進行計算之前立即進 行。也不能保證變量的更新會在表達式 ``完成" (按照 ANSI C 的術語, 在下一個 ``序列點" 之前, 參見問題 3.7) 之前的某個時刻進行。 本例中, 編譯器選擇使用變量的舊值相乘以後再對二者進行自增運算。

包含多個不確定的副作用的代碼的行為總是被認為未定義。(簡單而言, ``多個不確定副作用" 是指在同一個表達式中使用導致同一對像修改兩 次或修改以後又被引用的自增, 自減和賦值操作符的任何組合。這是一 個粗略的定義; 嚴格的定義參見問題 3.7, ``未定義" 的含義 參見問題 11.32。) 甚至都不要試圖探究這些東西在你的編譯 器中是如何實現的 (這與許多 C 教科書上的弱智練習正好相反); 正如  K&R 明智地指出, ``如果你不知道它們在不同的機器上如何實現, 這樣的無知可能恰恰會有助於保護你。begintex2html_deferred

參考資料: [K&R1, Sec. 2.12 p. 50]; [K&R2, Sec. 2.12 p. 54]; [ISO, Sec. 6.3]; [H&S, Sec. 7.12 pp. 227-9]; [CT&P, Sec. 3.7 p. 47]; [PCS, Sec. 9.5 pp. 120-1]。

翻譯朱群英、孫雲, LaTeX2HTML 編譯 朱群英 (2005-06-23)