main()
{
int i=1, j=1, k=2;
if ( (j-- || k++) && i++ )
printf("%d,%d,%d\n", i, j, k);
}
// 輸出:2,0,2
j--, k++, i++):先使用當前值參與運算,再將變量值加 1 或減 1。||)短路求值:左操作數為真(非 0)時,右操作數不再求值。&&)短路求值:左操作數為假(0)時,右操作數不再求值。| 步驟 | 表達式 | 當前值 | 求值結果 | 副作用(變量變化) |
|---|---|---|---|---|
| 1 | j-- | j=1 | 1 (真) | j 變為 0 |
| 2 | j-- || k++ | 左邊已真 | 1 (真) | 短路,k++ 不執行,k 保持 2 |
| 3 | (...) && i++ | 左邊為真 | 繼續求值右邊 | i++ 執行:i 由 1 變為 2 |
| 4 | if 整體 | 真 | 進入 printf | 輸出 i=2, j=0, k=2 |
j-- 結果是 0」—— 實際 j-- 的表達式值是舊值 1,副作用才是 j 變 0。k++ 會執行」—— 因 || 短路,左邊為真時右邊完全跳過,k 不變。i++ 不執行」—— && 左邊為真,右邊必須求值,故 i++ 執行,i 變 2。++, --, 賦值),改為分步寫入,提高可讀性並消除歧義。-Wall -Wextra),可捕獲部分可疑用法。本例輸出 2,0,2 完全符合 C 標準:j-- 提供真值觸發 || 短路,k++ 被跳過,i++ 在 && 右側被執行。理解「表達式值」與「副作用」的區別、掌握短路求值規則,是寫出正確、可維護 C 代碼的關鍵。