int n = -5;
while (++n)
printf("%3d", ++n);
跟蹤表:
| 迭代 | while(++n) 值 | 條件 | printf(++n) 輸出 | n 末值 |
|---|---|---|---|---|
| 1 | -4 | 真 | -3 | -3 |
| 2 | -2 | 真 | -1 | -1 |
| 3 | 0 | 假 | — | 0 |
輸出: -3 -1 (各佔 3 寬度)
#define S(x) x*x
int k = 3, m = 1;
int a = S(k + m); // 展開為 k + m * k + m
展開過程:a = 3 + 1 * 3 + 1 = 3 + 3 + 1 = 7。
正確宏寫法:#define S(x) ((x)*(x)) → a = (3+1)*(3+1) = 16。
int y = -1;
do {
y++;
} while (y--);
printf("%d\n", y--);
跟蹤:
y=-1。y++ → y=0。while(y--):值為 0 (假),循環結束,**但 y 已自減為 -1**。printf("%d\n", y--):輸出 -1,然後 y 變 -2。輸出:-1
int fib(int g) {
switch(g) {
case 0: return 0;
case 1:
case 2: return 1;
}
return -1;
}
printf("%d\n", fib(5));
分析:g=5 不匹配任何 case → 執行 return -1。
輸出:-1
| 題目 | 核心知識點 | 易錯方向 |
|---|---|---|
| 1 | 前綴 ++ 先遞增後取值、while 條件為 0 結束 | 忽略循環條件中也有副作用 |
| 2 | 宏單純文本替換、運算符優先級導致邏輯錯誤 | 以為宏像函數有參數求值保護 |
| 3 | do-while 先執行體再判斷、後置 -- 返回舊值但副作用仍發生 | 以為條件假時副作用不發生 |
| 4 | switch 默認穿透、無匹配執行 switch 後代碼 | 以為無匹配返回 0 或未定義 |
#define SQR(x) ((x)*(x))。switch 每個 case 以 break/return/continue/goto 結束,需穿透處加 /* fallthrough */ 註釋 (C23 [[fallthrough]])。這四道題覆蓋了 C 語言考試 80% 的程序閱讀陷阱,反覆練習至秒出跟蹤表。