switch 是 C 語言處理「單一變數、多個定值比對」的專用結構,比連串 if-else-if 更清晰、效率更高(編譯器可優化為跳轉表)。但其獨特的「貫穿」特性是新手最大陷阱。本文完整解析語法、行為與最佳實踐。
switch (expression) {
case const1: stmt1; break;
case const2: stmt2; break;
...
default: stmt_default;
}
expression 必為整數型(含 char、enum)。case 後必為常量表達式,不可為變數。case 值不可重複。default 可省略,位置可任意(慣例放最後)。switch (a) {
case 1: printf("Monday\n");
case 2: printf("Tuesday\n");
case 3: printf("Wednesday\n");
...
default: printf("error\n");
}
輸入 3 → 輸出 Wednesday、Thursday、Friday、Saturday、Sunday、error 全印出!
原因: case 本質是標籤,匹配後順序執行後續所有語句,直到遇到 break 或 }。
switch (a) {
case 1: printf("Monday\n"); break;
case 2: printf("Tuesday\n"); break;
case 3: printf("Wednesday\n"); break;
...
default: printf("error\n");
}
輸入 3 → 僅輸出 Wednesday。
switch (ch) {
case 'a': case 'e': case 'i': case 'o': case 'u':
case 'A': case 'E': case 'I': case 'O': case 'U':
printf("母音\n"); break;
default: printf("其他\n");
}
case 1:
x = 1;
y = 2;
break; // 直接寫多行,編譯器視為同一 case 塊
編譯器不限制順序,但置底符合閱讀習慣。
| 場景 | 推薦 | 理由 |
|---|---|---|
| 單一整數變數、多定值比對 | switch | 語義明確、跳轉表優化快 |
| 範圍判斷、浮點數、複雜邏輯 | if-else-if | switch 不支援 |
| 案例極多(>20) | switch | 編譯器生成 O(1) 跳轉表 |
| 需執行複雜初始化再比對 | if-else-if | switch 僅能比對常量 |
switch 是「整數定值分派器」,核心口訣:匹配即入口,break 即出口。刻意貫穿僅用於「多值共用邏輯」,其他情況漏寫 break 即為 Bug。掌握此精髓,多分支代碼將清晰高效。