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

C 語言前綴 ++a vs 後綴 a++ 核心差異:值、副作用、序列點

     編輯:C 語言問答

一句話總結

兩者都會將 a 加 1,但「表達式的值」不同:

  • ++a(前綴)→ 先遞增,**表達式值為遞增後的新值**。
  • a++(後綴)→ 先取值,**表達式值為遞增前的舊值**,然後再遞增。

經典範例

int a = 5, b;
b = ++a; // a=6, b=6  (先加後用)
int x = 5, y;
y = x++; // x=6, y=5  (先用後加)

單獨語句下無差異

a++;   // 效果等同 ++a;  只是單純遞增,表達式值被丟棄
++a;

深層機制:副作用與序列點

  • 副作用:修改物件儲存值(如 a++ 修改 a)。
  • 序列點:C 標準規定在特定時間點(語句結尾 ;、|| && ?: , 運算子、函數呼叫前後),所有先前副作用必須完成,且無副作用重疊。
  • 未定義行為 (UB) 陷阱:同一表達式中對同一物件多次修改、或修改後又讀取(非為了決定新值),行為未定義。
    例:a = a++ + ++a;、printf("%d %d", i++, ++i);、a[i] = i++; —— **嚴禁寫法**。

安全準則

  1. 一條語句**只做一件遞增/遞減**,不要混在複雜表達式裡。
  2. 需要舊值用 a++,需要新值用 ++a,語意明確。
  3. 函數參數求值順序**未規定**,func(i++, ++i) 參數遞增順序不可預期 → 分成兩句。

實務建議

  • 迴圈計數器慣用 ++i(意圖明確、避免臨時變數,雖然現代編譯器優化後無差異)。
  • 輸出/計算需用舊值時寫 i++,如 arr[i++] = val;。
  • 開啟 -Wall -Wextra -Wsequence-point(GCC/Clang)可偵測部分 UB。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved