int i = 3;
int b = i++ * i++; // 結果為何是 9?
;)、函數調用進入/返回點、&&、||、?:、,(逗號運算符)等。表達式 i++ * i++ 中,i 在無序列點分隔的情況下被修改了兩次(兩次後置自增),且值的讀取與修改順序未定義。編譯器可能選擇:先用舊值相乘(3*3=9),再執行兩次自增;也可能產生其他結果。只有到達下一個序列點(分號)時,自增操作才保證真正完成。
同一代碼在 Code::Blocks (GCC) 和 VS2010 (MSVC) 下運行結果不同,直觀證明了未定義行為的編譯器相關性。
++i(前置)與 i++(後置)的副作用完成時機不同。