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

C++ 未定義行為經典案例:i = i++ 輸出結果不確定

     編輯:程式設計綜合問答

代碼片段

int i = 2;
i = i++;
cout << i;  // 輸出多少?

標準解讀

C/C++ 標準規定:對同一標量對象在兩個序列點之間修改超過一次,行為未定義(Undefined Behavior, UB)。

  • i++ 產生副作用:修改 i(遞增)。
  • i = ... 產生副作用:修改 i(賦值)。
  • 兩者在同一表達式中無序列點分隔,構成 UB。

編譯器實現差異

Java 對比

// Java 有明確規範:左邊先計算,右邊後計算
int i = 2;
i = i++;  // i = 2 (舊值賦值覆蓋遞增)
i = ++i;  // i = 3 (先遞增再賦值)

Java 語言規範定義了運算順序,不存在 UB。

最佳實踐

  • 絕不編寫 同一變量在表達式中多次修改的代碼。
  • 拆分為多條語句:i++; i = i; 或 int old = i; i++; i = old;。
  • 啟用編譯器警告:-Wall -Wextra -Wsequence-point (GCC/Clang),/Wall (MSVC)。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved
編譯器典型輸出說明
GCC/Clang2先取舊值賦值,再執行遞增,最終賦值覆蓋遞增
MSVC3先遞增,再賦值舊值,結果為遞增後值
其他崩潰/隨機值優化器可能刪除代碼或產生任意指令