代碼片段
int n = 2;
if (n++ % 3) printf("*");
else printf(" # ");
逐步執行推導
- 初始狀態:
n = 2
- 表達式求值順序:
n++ % 3
- 後置遞增
n++:**當前值參與運算**,然後 n 增加 1
- 參與
% 運算的值是 2 (遞增前的值)
2 % 3 = 2 (餘數)
- if 判斷邏輯:C 語言中**任何非零值為真 (true)**,零為假 (false)
2 非零 → **條件為真**
- 執行
printf("*")
- 副作用完成:
n 變為 3
結果
輸出:*
語句結束後 n = 3。
關鍵知識點對照表
| 代碼 | 參與運算的值 | 運算後 n 值 | if 判斷結果 | 輸出 |
if (n++ % 3) (n=2) | 2 | 3 | true (2≠0) | * |
if (++n % 3) (n=2) | 3 (先增後用) | 3 | false (3%3=0) | # |
if (n++ % 3) (n=3) | 3 | 4 | false (0) | # |
if (n++ % 3) (n=4) | 4 | 5 | true (1) | * |
後置遞增 (n++) vs 前置遞增 (++n) 核心差異
int a = 5, b = 5;
int x = a++; // x = 5, a = 6 (先用後增)
int y = ++b; // y = 6, b = 6 (先增後用)
- 返回值不同:後置返回舊值,前置返回新值
- 副作用相同:最終變量值均 +1
- 優先級:後置
++ 優先級高於前置 ++ (但同一表達式中不會同時出現同一變量的前後置)
實際工程中的最佳實踐
- 避免在複雜表達式中使用副作用運算符:
if (n++ % 3) 易誤讀,建議拆分:
int remainder = n % 3;
n++;
if (remainder) { ... }
- 循環迭代優先用前置遞增:
for (int i = 0; i < n; ++i) — 對簡單類型無性能差異,但對迭代器類類型避免臨時對象拷貝 (C++ 習慣回饋 C 風格)
- 斷言副作用可見性:
assert(ptr++ != NULL) 在 Release 版 (NDEBUG) 會移除副作用導致邏輯錯誤,**斷言內禁用副作用**
總結
n=2 時 n++ % 3 取值 2,非零為真,輸出 *,隨後 n=3。
核心:**後置遞增「先用後增」,C 語言非零即真**。
工程上:拆分副作用、優先前置遞增、斷言禁副作用,寫出可讀、可維護、無驚喜的代碼。
- 上一篇文章: 自學C語言高效路徑:書籍+視頻+社群+實戰四位一體
- 下一篇文章: C語言函數返回二維數組的正確姿勢:結構體封裝、指針傳遞、動態分配三種方案
Copyright ©
程式碼之家 All Rights Reserved