c = (a -= ++a), (a += b, b += 4);
++a:前置自增,`a` 值加 1,結果為新值。副作用:修改 a。a -= ++a:複合賦值。右邊 `++a` 又修改 `a`,左邊 `a -=` 也修改 `a`。**同一表達式(無序列點)雙重修改 a → 未定義行為**。編譯器可能產生任意結果。,` 是序列點:左邊表達式(含副作用)完成後,右邊開始。但左邊已 UB,整個語句無意義。a += b, b += 4:逗號分隔,左邊修改 `a`,右邊修改 `b`,互不干擾,行為定義良好(前提是 `a`、`b` 無重疊)。GCC、MSVC、Clang 對 UB 表達式可能產生不同結果,甚至同編譯器不同優化等級結果不同。**切勿編寫依賴求值順序的代碼。**
Alt+8 反彙編窗口;GCC:objdump -d)觀察指令序列。// 原意:a = a - (a+1) ? 拆分為清晰步驟
a = a + 1; // ++a
int temp = a; // 保存 ++a 結果
a = a - temp; // a -= temp
// 後續獨立操作
a = a + b;
b = b + 4;
c = a; // 或根據實際邏輯賦值
**原則**:每個語句只做一件事,避免在同一表達式中多次修改同一變量。閱讀《C 專家編程》第 3 章「令人驚訝的 C 語言」深化理解。