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

C語言考試經典程序閱讀題精解:while、宏、do-while、switch 陷阱

     編輯:C 語言問答

四道程序閱讀題逐行跟蹤

題 1:while 循環雙重自增

int n = -5;
while (++n)
    printf("%3d", ++n);

跟蹤表:

迭代while(++n) 值條件printf(++n) 輸出n 末值
1-4真-3-3
2-2真-1-1
30假—0

輸出: -3 -1 (各佔 3 寬度)

題 2:宏副作用陷阱

#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。

題 3:do-while 短路與後置自減

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

題 4:switch 缺 break 穿透

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宏單純文本替換、運算符優先級導致邏輯錯誤以為宏像函數有參數求值保護
3do-while 先執行體再判斷、後置 -- 返回舊值但副作用仍發生以為條件假時副作用不發生
4switch 默認穿透、無匹配執行 switch 後代碼以為無匹配返回 0 或未定義

避坑清單

  • 宏定義**參數加括號、整體加括號**:#define SQR(x) ((x)*(x))。
  • 循環條件中**盡量避免副作用**,或極度清晰註釋。
  • switch 每個 case 以 break/return/continue/goto 結束,需穿透處加 /* fallthrough */ 註釋 (C23 [[fallthrough]])。
  • 程序閱讀題**建立變量追蹤表**,逐行模擬 CPU 執行,勿靠直覺。

這四道題覆蓋了 C 語言考試 80% 的程序閱讀陷阱,反覆練習至秒出跟蹤表。

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