switch 是多分支選擇的高效結構,比多層 if-else 更清晰、效能更好。本文系統講解語法、執行流程、break 關鍵作用、使用經驗與常見陷阱,適合站長快速回顧與實戰參考。
switch (表達式) {
case 常量1:
語句;
break;
case 常量2:
語句;
break;
default:
語句;
break;
}
case 常量break 跳出 switchdefault(可選)break → 貫穿 繼續執行下一 case
switch(x) {
case 1: printf("一"); // 無 break
case 2: printf("二");
case 3: printf("三");
}
x=1 輸出:一二三 ← 通常不是預期
break 使分支「井水不犯河水」,符合多分支互斥語義。
| 規則 | 說明 |
|---|---|
| 配合 case/break | 標準三件套,缺一不可 |
| 表達式類型 | 整型、字符型、枚舉型(C 不支援字符串) |
| case 後只能是常量 | 整型/字符常量,不可為變量/表達式 |
| case 值互不相同 | 重複會導致邏輯錯誤 |
| case/default 順序可打亂 | 不影響執行效果,但建議 default 置底 |
| 建議加 default | 處理預期外值,提升健壯性 |
switch(ch) {
case 'a': case 'e': case 'i': case 'o': case 'u':
case 'A': case 'E': case 'I': case 'O': case 'U':
printf("元音"); break;
default: printf("輔音");
}
// 方案 1:哈希映射
// 方案 2:if-else 鏈 + strcmp
// 方案 3:自定義跳轉表
| 錯誤代碼 | 問題 | 修正 |
|---|---|---|
case x > 0: | case 後非常量 | 用 if-else |
case 1: case 1: | 重複常量 | 合併或刪除 |
| 漏寫 break | 非預期貫穿 | 加 break 或註釋 // fallthrough |
| switch(float) | 浮點型不可用 | 轉整型或用 if-else |
| default 缺失 | 無匹配時無處理 | 加 default 或斷言 |
switch:編譯器常優化為跳轉表 O(1)if-else 鏈:順序比較 O(n)switch 明顯優勢