| 形式 | 範例 | 運算值 | 副作用時機 |
|---|---|---|---|
| 前綴 ++ | ++i | 遞增後的值 | 立即 |
| 後綴 ++ | i++ | 遞增前的值 | 運算值取得後 |
| 前綴 -- | --i | 遞減後的值 | 立即 |
| 後綴 -- | i-- | 遞減前的值 | 運算值取得後 |
C++ 標準規定:單一表達式中對同一標量物件進行多次修改,或修改後又存取其值(除非為了計算新值),行為未定義(Undefined Behavior, UB)。編譯器可產生任意結果。
int i = 3;
std::cout << (i++) + (i++) + (i++) << std::endl; // UB!
std::cout << i << std::endl;
// 可能輸出 9, 6(某編譯器:全部取初值 3+3+3=9,語句結束後 i=6)
// 也可能輸出 12, 6(左到右:3+4+5=12)
// 甚至可能輸出其他值或崩潰
切記:不要在單一表達式中對同一變數使用多個 ++/--。這不是「編譯器實作細節」,而是標準明確規定的 UB。
int i = 3;
std::cout << (++i) + (++i) + (++i) << std::endl; // UB!
// 某編譯器:先 i+=3 → i=6,每個 ++i 值為 6 → 18
// 其他編譯器結果不同
int i = 3;
std::cout << (++i) + (i++) + (++i) << std::endl; // UB!
// 某編譯器:先處理兩個前綴 i+=2 → i=5,三項皆取 5 → 15,語句結束 i=6
++i+++i 的處理++i+++i 經「最大咬合原則」解析為 (++i) ++ + i → ++i 後接 ++(需左值)→ 編譯錯誤:'++' needs l-value。
合法寫法需加空格或括號:
++i + ++i // 兩個前綴,但同表達式雙修改 → UB
i++ + i // 合法:i++ 修改,+i 只讀取 → 明確定義
(i++) + i // 同上,括號明確分組
i+++i 的解析i+++i → (i++) + i(最大咬合:i++ 是合法後綴運算式)。
i + ++i → i + (++i)。但同表達式修改與存取 i → UB!
int i = 3;
std::cout << i++ << " and " << i++ << std::endl;
// 某編譯器(VC6/VC2005)從右往左求值流運算子參數:
// 右側 i++ → 3,i=4;左側 i++ → 4,i=5 → 輸出 "4 and 3"
// 標準未規定 << 參數求值順序,故結果不可攜帶
++i; sum += i; ++i; sum += i;<< 參數求值順序未定義,若相依副作用請分行。-Wall -Wextra -pedantic 或 /W4),可偵測部分 UB 模式。