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

C語言switch-case陷阱:後置遞增導致case標籤不匹配的經典案例分析

     編輯:程式設計綜合問答

代碼現場


int k=0; 
char c='A';
do {
    switch(c++)  // 關鍵:使用後置遞增
    {
        default: k=k*2; break;
        case 'A': k++; break;
        case 'B': k--;
        case 'C': k+=2; break;
        case 'D': k=k%2; continue;
    }
    k++;
} while(c<'F');
printf("k=%d\n", k);  // 輸出3

逐步執行追蹤

迭代switch判斷值(c遞增前)匹配case執行語句k值變化循環後c值
1'A'case 'A'k++ → k=1; k++ → k=22'B'
2'B'case 'B'k-- → k=1; 穿透case 'C': k+=2 → k=3; k++ → k=44'C'
3'C'case 'C'k+=2 → k=6; k++ → k=77'D'
4'D'case 'D'k=k%2 → k=1; continue(跳過k++)1'E'
5'E'defaultk=k*2 → k=2; k++ → k=33'F'

核心知識點

  1. 後置遞增`c++`:表達式值為遞增前的值,副作用在序列點(分號)前完成
  2. switch判斷使用舊值:`switch(c++)`匹配的是`c`遞增前的值
  3. case穿透特性:無`break`則順序執行後續case
  4. continue作用於循環:跳過本輪剩餘代碼(含循環末尾的`k++`)直接進入下輪判斷

修正建議


// 寫法1:前置遞增,邏輯更直觀
switch(++c) { ... }

// 寫法2:分離遞增與判斷
switch(c) { ... }
c++;

// 寫法3:避免在switch條件中做副作用操作
char current = c;
c++;
switch(current) { ... }

總結

結果`k=3`來自第五輪default分支。這道題考察三大核心:後置遞增語義、switch穿透機制、continue跳過循環增量。實戰中嚴禁在條件判斷中混入副作用操作。

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