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

C語言後置運算符經典題:a=5; b=a+++a-- 詳解

     編輯:C 語言問答

經典面試題深度解析

代碼片段:

int a = 5, b;
b = a++ + a--;
printf("a=%d, b=%d\n", a, b);

關鍵:運算符優先級與副作用順序

C 標準規定:後置 ++/-- 的副作用(修改變量值)在序列點完成,但在表達式求值順序上屬於未指定行為(Unspecified Behavior)。

標準合規編譯器典型結果

大多數編譯器(GCC、MSVC、Clang)採用從左到右求值:

  1. a++:取值 5,a 變為 6(副作用延遲)
  2. a--:此時 a 已為 6,取值 6,a 變為 5(副作用延遲)
  3. b = 5 + 6 = 11
  4. 序列點(語句結束)應用副作用:a 最終為 5

結果:a=5, b=11

為什麼不是 b=10?

若誤以為 a++ 取值 5 後 a 立即變 6,a-- 取值 6 後立即變 5,則 b=5+5=10。但標準不保證副作用立即生效,僅保證在下一序列點前完成。實際上編譯器通常將兩次副作用合併:a 先 +1 再 -1,最終不變。

標準警告

C 標準(ISO/IEC 9899)明確指出:對同一標量對象在兩個序列點之間多次修改,或修改後又讀取(非為了確定新值),行為未定義(Undefined Behavior)。

嚴格說法:b = a++ + a--; 屬於未定義行為,不同編譯器、不同優化等級可能產生不同結果。

最佳實踐

絕不在生產代碼中寫這類表達式。拆分為清晰語句:

int a = 5;
int b = a + a;  // b = 10
a++; a--;       // a 回到 5

面試中遇到此題,應回答:「此代碼屬未定義行為,標準不保證結果,實際開發中嚴禁編寫。」

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