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

C語言邏輯運算符短路求值與後置遞增陷阱解析

     編輯:C 語言問答

if ((j++ || k++) && i++) 經典面試題深度解析

代碼

int main() {
    int i = 1, j = 1, k = 2;
    if ((j++ || k++) && i++)
        printf("%d,%d,%d\n", i, j, k);
    return 0;
}

輸出結果:2,2,2

逐步執行邏輯

  1. j++:j 當前值 1 (真),表達式值為 1。短路求值:|| 左操作數為真,**不再計算右操作數 k++**。j 遞增為 2,k 保持 2。
  2. && 左操作數為真 (1),需計算右操作數 i++。
  3. i++:i 當前值 1 (真),表達式值為 1。i 遞增為 2。
  4. if 條件整體為真,執行 printf。
  5. 最終值:i=2, j=2, k=2。

核心知識點

運算符短路規則副作用執行時機
||左真則短路(右不算)左操作數求值後立即執行副作用
&&左假則短路左操作數求值後立即執行副作用
? :條件真只算第2項,假只算第3項選中項求值時執行
,不短路,左到右順序求值各子表達式求值後執行

塊作用域補充問題

如果在函數中的復合語句中定義了一個變量,則該變量只在該復合語句中有效對麼?

是的。C 語言採用塊作用域:{ ... } 內聲明的變量,作用域從聲明處開始到塊結束。例如:

void foo() {
    int a = 1;
    { int a = 2; printf("%d\n", a); }  // 輸出 2,內層 a 遮蔽外層
    printf("%d\n", a);  // 輸出 1
}

C99 允許在塊中任意位置聲明變量(不必在塊開頭)。

避坑建議

  • **不要在條件判斷中混用副作用**(++、--、賦值),極易產生未定義行為或難讀代碼。
  • 編譯器優化可能打亂副作用順序(雖然 && || ? : , 有序列點保證順序,但其他運算符無序列點)。
  • 推薦寫法:先計算/遞增,再判斷,代碼清晰且無歧義。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved