C# 的遞增(++)與遞減(--)運算符看似簡單,但其前綴/後綴語意差異、副作用順序與運算元限制,往往是 Bug 溫床。本文深度解析核心機制與實戰陷阱。
適用於所有數值類型與 enum:
sbyte, byte, short, ushort, int, uint, long, ulong, char, float, double, decimal, enum
運算元必須是:
get 和 set)get 和 set)非法範例:
5++ // 常數 (x + y)++ // 表達式結果 readonlyField++ // 唯讀欄位
| 形式 | 語意 | 運算順序 | 表達式值 |
|---|---|---|---|
++x / --x | 前綴 | 先修改,後使用 | 修改後的值 |
x++ / x-- | 後綴 | 先使用,後修改 | 修改前的值 |
int x = 5; int y = x++; // y = 5, x = 6 y = ++x; // x = 7, y = 7
int x = 5; Console.WriteLine((x++) + (x++) + (x++)); // 輸出 18 int y = (x++) + (x++) + (x++); // y = 27
編譯器處理邏輯:
第二行同理:取值 8,9,10 → 相加 27 → x 變 11
C# 嚴格規定左至右評估順序:
// M() 先執行,再 N() int result = M() + N(); // a[i++] 先取 i 原值索引,再遞增 i var val = arr[i++];
for (int i = 0; i < n; i++)count++;、--remaining;return ++index;x = y++ + ++z;Process(x++, y++);(順序雖定但難讀)x = x++ + x++;(未定義行為風險)public struct Counter
{
public int Value { get; private set; }
public static Counter operator ++(Counter c)
{
return new Counter { Value = c.Value + 1 };
}
public static Counter operator --(Counter c)
{
return new Counter { Value = c.Value - 1 };
}
}
inc/dec),極快牢記「前綴回新值、後綴回舊值、副作用左至右」三大鐵律,並將複雜用法重構為清晰陳述式,即可避開 99% 的遞增遞減相關 Bug。