首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

C語言 switch 語句詳解:多分支選擇的正確姿勢與 break 陷阱

     編輯:關於C語言

switch 是 C 語言處理「單一變數、多個定值比對」的專用結構,比連串 if-else-if 更清晰、效率更高(編譯器可優化為跳轉表)。但其獨特的「貫穿」特性是新手最大陷阱。本文完整解析語法、行為與最佳實踐。

語法結構

switch (expression) {
    case const1: stmt1; break;
    case const2: stmt2; break;
    ...
    default: stmt_default;
}

核心規則

  • expression 必為整數型(含 char、enum)。
  • case 後必為常量表達式,不可為變數。
  • case 值不可重複。
  • default 可省略,位置可任意(慣例放最後)。

經典陷阱:缺少 break 的貫穿行為

範例 4-9:星期轉換(錯誤版)

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 或 }。

範例 4-10:正確版(加 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。

進階特性與技巧

1. 多 case 共用代碼(刻意貫穿)

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");
}

2. case 內多語句無需大括號

case 1:
    x = 1;
    y = 2;
    break;  // 直接寫多行,編譯器視為同一 case 塊

3. default 位置可任意,但建議置底

編譯器不限制順序,但置底符合閱讀習慣。

switch vs if-else-if 選擇指南

場景推薦理由
單一整數變數、多定值比對switch語義明確、跳轉表優化快
範圍判斷、浮點數、複雜邏輯if-else-ifswitch 不支援
案例極多(>20)switch編譯器生成 O(1) 跳轉表
需執行複雜初始化再比對if-else-ifswitch 僅能比對常量

總結

switch 是「整數定值分派器」,核心口訣:匹配即入口,break 即出口。刻意貫穿僅用於「多值共用邏輯」,其他情況漏寫 break 即為 Bug。掌握此精髓,多分支代碼將清晰高效。

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