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

C語言序列點與未定義行為:i++ * i++ 為什麼結果不確定?

     編輯:關於C語言

經典問題

int i = 3;
int b = i++ * i++;  // 結果為何是 9?

核心概念:序列點

  • 定義:程序執行中所有副作用(賦值、自增/減等)確定完成的點。
  • 常見序列點:語句結束的分號(;)、函數調用進入/返回點、&&、||、?:、,(逗號運算符)等。
  • 標準規定:在兩個序列點之間,對象最多只能被修改一次;修改順序未指定,若修改多次則行為未定義,不同編譯器結果可能不同。

詳細分析

表達式 i++ * i++ 中,i 在無序列點分隔的情況下被修改了兩次(兩次後置自增),且值的讀取與修改順序未定義。編譯器可能選擇:先用舊值相乘(3*3=9),再執行兩次自增;也可能產生其他結果。只有到達下一個序列點(分號)時,自增操作才保證真正完成。

實測對比

同一代碼在 Code::Blocks (GCC) 和 VS2010 (MSVC) 下運行結果不同,直觀證明了未定義行為的編譯器相關性。

避坑指南

  1. 避免在單一表達式中多次修改同一對象。
  2. 將複雜表達式拆分為多條語句,利用序列點保證順序。
  3. 理解 ++i(前置)與 i++(後置)的副作用完成時機不同。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved