switch (整數表達式) {
case 常量表達式1:
語句序列1;
break; // 關鍵:跳出 switch
case 常量表達式2:
語句序列2;
break;
default: // 可選:無匹配時執行
語句序列默認;
}
若 `case` 無 `break` (或 `return`/`goto`/`throw`),執行流**直接落入下一個 `case`/`default`**,直到遇到 `break` 或 `switch` 結束。
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; // 多標籤共用代碼:合法且常用
case 'b': ... break;
default: printf("其他\n");
}
有意穿透註釋**:`/* fallthrough */` (C17 `[[fallthrough]]` 屬性 / GCC `-Wimplicit-fallthrough` 需註釋抑制警告)。
char c = getchar();
switch (c) {
case '0'...'9': puts("數字"); break; // GCC 擴展:範圍 case (非標準)
// 標準寫法需多 case 或 if-else
case 'a': case 'b': ... case 'z':
case 'A': ... case 'Z': puts("字母"); break;
default: puts("其他");
}
enum Color { RED, GREEN, BLUE };
void paint(enum Color c) {
switch (c) {
case RED: puts("Red"); break;
case GREEN: puts("Green"); break;
case BLUE: puts("Blue"); break;
// 無 default,若新增枚舉值編譯器會警告 (-Wswitch-enum)
}
}
| 特性 | switch | if-else |
|---|---|---|
| 判斷類型 | 整數/枚舉 | 任意布爾表達式 |
| 比較方式 | 等值比較 | 任意關係/邏輯運算 |
| 效能 (多分支) | 跳躍表 O(1) / 二分 O(log n) | 線性 O(n) 順序求值 |
| 可讀性 (多常量值) | 高 | 低 |
| 範圍判斷 | 不支援 (標準) | 支援 |