面試經典題目:int i = 10; i += i++; // i = ? 許多開發者直覺回答 21,但在 C# 中執行結果卻是 20。本文深入解析 C# 與 C++ 在運算子評估順序上的根本差異。
static void Main()
{
int i = 10;
i += i++;
Console.WriteLine(i); // 輸出 20
}
int main()
{
int i = 10;
i += i++;
Console::WriteLine(i); // 輸出 21
return 0;
}
| 語言 | 規範 | 結果 |
|---|---|---|
| C# | 嚴格定義從左至右評估運算元 | 20 |
| C++ | 未定義行為,編譯器自行決定順序 | 21 (視編譯器而定) |
i += i++ 等價於 i = i + (i++)i 先評估為 10(暫存)i++:
i 值 10 作為運算元i 遞增為 11i,覆蓋先前的 11最終 i = 20。
C++ 標準未規定 i++ 的副作用(遞增)何時發生,編譯器可能先遞增再取值,或反之。VC++ 傾向先遞增,導致右邊運算元變為 11,結果 10+11=21。但這屬於未定義行為,不可攜帶。
i++; i += i; 或 i = i + i; i++; 使意圖明確。C# 為了語言安全性,明確規定左至右評估順序,犧牲部分靈活性換取可預測行為。理解此差異,能避免移植代碼時的隱性 Bug,也能在面試中展現對語言規範的深度掌握。