代碼片段:
int a = 5, b;
b = a++ + a--;
printf("a=%d, b=%d\n", a, b);
C 標準規定:後置 ++/-- 的副作用(修改變量值)在序列點完成,但在表達式求值順序上屬於未指定行為(Unspecified Behavior)。
大多數編譯器(GCC、MSVC、Clang)採用從左到右求值:
a++:取值 5,a 變為 6(副作用延遲)a--:此時 a 已為 6,取值 6,a 變為 5(副作用延遲)b = 5 + 6 = 11a 最終為 5結果:a=5, b=11
若誤以為 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
面試中遇到此題,應回答:「此代碼屬未定義行為,標準不保證結果,實際開發中嚴禁編寫。」