int a = 0;
int b = (++a) + (++a) + (++a); // b = ?
b = 7b = 9b = 9C++ 標準規定:
() 優先級最高,左至右求值。++ 右至左結合,但優先級同 ()。+ 左至右結合。= 右至左。嚴格依標準推導:三個 ++a 先執行 → a=3,再相加 → 3+3+3=9。結果 7 反而違背標準語法。
| 編譯器/選項 | 核心指令片段 | 結果 |
|---|---|---|
| VC6 Debug/No Opt | 逐條 inc [bp-2] 存儲到記憶體 | 7 |
| VC6 Max Speed | 寄存器 si 累加,最終 add ax,si×3 | 9 |
| TC3.0 C++ | xor si,si; inc si×3; add ax,si×3 | 9 |
| TC2.0 C | 雙寄存器 si,di 無記憶體存取 | 9 |
++a 即寫回記憶體,下一次讀取見到最新值 → 1+2+3=6?實測 7,說明 VC 以「運算單元」為粒度重排。a 昇格為寄存器變數,三次遞增在寄存器完成,最後一次性寫回 → 3+3+3=9。開啟最佳化啟用:
register 關鍵字)編譯器將整個表達式視為單一計算圖,在寄存器內完成所有副作用,再提交結果。
++a; ++a; ++a; b = a+a+a;/Wall 或靜態分析工具可捕獲此類序列點違規。此例完美詮釋:電腦只遵循固定的語法模式執行,不具備人類的語義推理能力。寫出無歧義代碼,才是工程師的責任。