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

C 語言 count++ 未定義行為深度解析:參數求值順序與序列點

     編輯:程式設計疑難解答

經典陷阱程式碼


int count = 0;
printf("%d %d %d\n", count++, count++, count++); // 輸出 2 1 0?0 1 2?亂碼?全看編譯器心情
count = count++; // 结果 0?1?未定義

標準規定:未定義行為 (UB)

C/C++ 標準**不規定**函數參數求值順序(C++17 起規定左至右,但副作用完成時機仍未序),且**同一序列點內對同一標量物件多次修改**屬於 UB。

為什麼會出現 2 1 0?

  • 多數編譯器(GCC/MSVC/Clang)採用**參數從右向左入棧**(調用慣例 cdecl)。
  • 右邊 count++ 先求值得 0,count 變 1;中間得 1,變 2;左邊得 2,變 3。
  • 再按格式字串左至右彈棧輸出:2 1 0。

**但這只是特定編譯器的實作細節,不可依賴!**

前置 ++ 與後置 ++ 的真相

  • ++count:先增後用,值為增後結果。
  • count++:先用後增,值為增前結果。
  • **兩者在複合表達式中混用同樣構成 UB**,編譯器可能將前置 ++ 視為「取址傳遞」導致更詭異結果。

鐵律

單一表達式中,同一變數最多修改一次;讀取與修改不可無序混用。

需拆分為多條語句:


int a = count++;
int b = count++;
int c = count++;
printf("%d %d %d\n", a, b, c);
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved