首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C# 陷阱解析:i += i++ 為何結果是 20 而非 21?

     編輯:關於C語言

前言

面試經典題目:int i = 10; i += i++; // i = ? 許多開發者直覺回答 21,但在 C# 中執行結果卻是 20。本文深入解析 C# 與 C++ 在運算子評估順序上的根本差異。

程式碼驗證

C# 程式碼

static void Main()
{
    int i = 10;
    i += i++;
    Console.WriteLine(i); // 輸出 20
}

C++ 程式碼 (VS.NET 2003)

int main()
{
    int i = 10;
    i += i++;
    Console::WriteLine(i); // 輸出 21
    return 0;
}

核心差異:評估順序規範

語言規範結果
C#嚴格定義從左至右評估運算元20
C++未定義行為,編譯器自行決定順序21 (視編譯器而定)

C# 逐步執行邏輯

  1. i += i++ 等價於 i = i + (i++)
  2. 左邊 i 先評估為 10(暫存)
  3. 右邊 i++:
    1. 取得目前 i 值 10 作為運算元
    2. 將 i 遞增為 11
  4. 執行加法:10 + 10 = 20
  5. 將結果 20 指派給左邊 i,覆蓋先前的 11

最終 i = 20。

C++ 為何不同

C++ 標準未規定 i++ 的副作用(遞增)何時發生,編譯器可能先遞增再取值,或反之。VC++ 傾向先遞增,導致右邊運算元變為 11,結果 10+11=21。但這屬於未定義行為,不可攜帶。

最佳實務建議

  • 避免在同一運算式中對同一變數進行讀寫與副作用操作。
  • 拆分為多行:i++; i += i; 或 i = i + i; i++; 使意圖明確。
  • 啟用編譯器警告(C# 預設不警告,但 ReSharper 等工具會提示)。

結語

C# 為了語言安全性,明確規定左至右評估順序,犧牲部分靈活性換取可預測行為。理解此差異,能避免移植代碼時的隱性 Bug,也能在面試中展現對語言規範的深度掌握。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved