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

C語言後置自增減與邏輯運算符短路求值詳解

     編輯:C 語言問答

現象重現

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

核心知識點

  1. 後置自增減(j--, k++, i++):先使用當前值參與運算,再將變量值加 1 或減 1。
  2. 邏輯或(||)短路求值:左操作數為真(非 0)時,右操作數不再求值。
  3. 邏輯與(&&)短路求值:左操作數為假(0)時,右操作數不再求值。
  4. C 語言中「真」的定義:任何非 0 值均為真,0 為假。

逐步執行追蹤

步驟表達式當前值求值結果副作用(變量變化)
1j--j=11 (真)j 變為 0
2j-- || k++左邊已真1 (真)短路,k++ 不執行,k 保持 2
3(...) && i++左邊為真繼續求值右邊i++ 執行:i 由 1 變為 2
4if 整體真進入 printf輸出 i=2, j=0, k=2

常見誤區澄清

  • 誤區:「j-- 結果是 0」—— 實際 j-- 的表達式值是舊值 1,副作用才是 j 變 0。
  • 誤區:「k++ 會執行」—— 因 || 短路,左邊為真時右邊完全跳過,k 不變。
  • 誤區:「i++ 不執行」—— && 左邊為真,右邊必須求值,故 i++ 執行,i 變 2。

最佳實踐建議

  1. 在條件判斷中避免帶副作用的運算(如 ++, --, 賦值),改為分步寫入,提高可讀性並消除歧義。
  2. 若必須使用,請牢記短路規則與後置運算符語義,並添加註釋說明預期行為。
  3. 編譯器警告等級調高(如 -Wall -Wextra),可捕獲部分可疑用法。

總結

本例輸出 2,0,2 完全符合 C 標準:j-- 提供真值觸發 || 短路,k++ 被跳過,i++ 在 && 右側被執行。理解「表達式值」與「副作用」的區別、掌握短路求值規則,是寫出正確、可維護 C 代碼的關鍵。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved