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

C# 遞增遞減運算子深度解析:前綴/後綴差異、副作用、IL 層面與最佳實務

     編輯:關於C#

前綴 vs 後綴核心差異

運算子運作順序運算式值副作用時間
++i / --i先遞增/遞減,後取值新值立即
i++ / i--先取值,後遞增/遞減舊值序列點後 (陳述式結束前)

程式碼行為示範

int a = 5;
int b = ++a; // a=6, b=6 (前綴)

int c = 5;
int d = c++; // c=6, d=5 (後綴)

// 複雜運算式中的副作用順序
int x = 1;
int y = x++ + ++x; // C# 左到右評估:
// 1. x++ 取值 1,x 變 2
// 2. ++x 先遞增 x 變 3,取值 3
// y = 1 + 3 = 4, x = 3

// 迴圈中常見模式
for (int i = 0; i < 10; i++) { }        // 後綴 (慣例)
for (int i = 0; i < 10; ++i) { }        // 前綴 (效能相同,整數無差異)

// 避免:同一變數多次副作用 (未定義行為在 C/C++,C# 有定義但難讀)
int z = 1;
int result = z++ + z++ + ++z; // 請勿這樣寫

IL 層面觀察


// ++i (前綴)
ldloc.0     // 載入 i
ldc.i4.1    // 載入 1
add         // 相加
stloc.0     // 存回 i
ldloc.0     // 載入新值作為運算式結果

// i++ (後綴)
ldloc.0     // 載入 i
dup         // 複製舊值
ldc.i4.1
add
stloc.0     // 存回 i (新值)
// 堆疊頂端仍為舊值 (dup 保留)

適用型別與多載

  • 內建支援:所有數值型別 (sbyte, byte, short, ushort, int, uint, long, ulong, float, double, decimal)、char、列舉、指標 (unsafe)
  • 可多載:public static T operator ++(T t) / operator --
  • 自訂型別建議同時實作 operator +、operator - 保持一致性

常見陷阱與最佳實務

陷阱說明建議
運算式中混用前/後綴難以推導結果拆分為多行陳述式
迴圈條件中使用後綴while (i++ < 10) 易誤解改用 while (i < 10) { ... i++; }
屬性存取器副作用obj.Prop++ 隱含 get/set 兩次呼叫避免對屬性直接遞增,改用區域變數
事件處理器註冊/移除event += Handler 非遞增運算子切勿混淆

效能考量

現代 JIT 編譯器對區域變數前綴/後綴產生相同機器碼。差異僅在運算式值用途。對屬性/索引器/欄位,前綴可能少一次載入,但微乎其微。可讀性優先。

前綴後綴
IL對照
範例

本文對應《叩響 C# 之門》第 3.2 節自增自減運算子教學內容

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