int i = 2;
i = i++;
cout << i; // 輸出多少?
C/C++ 標準規定:對同一標量對象在兩個序列點之間修改超過一次,行為未定義(Undefined Behavior, UB)。
i++ 產生副作用:修改 i(遞增)。i = ... 產生副作用:修改 i(賦值)。| 編譯器 | 典型輸出 | 說明 |
|---|---|---|
| GCC/Clang | 2 | 先取舊值賦值,再執行遞增,最終賦值覆蓋遞增 |
| MSVC | 3 | 先遞增,再賦值舊值,結果為遞增後值 |
| 其他 | 崩潰/隨機值 | 優化器可能刪除代碼或產生任意指令 |