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=2 | 2 | 'B' |
| 2 | 'B' | case 'B' | k-- → k=1; 穿透case 'C': k+=2 → k=3; k++ → k=4 | 4 | 'C' |
| 3 | 'C' | case 'C' | k+=2 → k=6; k++ → k=7 | 7 | 'D' |
| 4 | 'D' | case 'D' | k=k%2 → k=1; continue(跳過k++) | 1 | 'E' |
| 5 | 'E' | default | k=k*2 → k=2; k++ → k=3 | 3 | 'F' |
// 寫法1:前置遞增,邏輯更直觀
switch(++c) { ... }
// 寫法2:分離遞增與判斷
switch(c) { ... }
c++;
// 寫法3:避免在switch條件中做副作用操作
char current = c;
c++;
switch(current) { ... }
結果`k=3`來自第五輪default分支。這道題考察三大核心:後置遞增語義、switch穿透機制、continue跳過循環增量。實戰中嚴禁在條件判斷中混入副作用操作。