C語言switch case 語句

2020-07-16 10:04:20
switch 語句根據控制表示式的值,可以把程式流跳轉到多個語句中的一個執行:

switch (表示式) 語句


括號裡的表示式具有整數型別,並且這裡的語句就是該 switch 主體,它包括了多個 case 標籤,以及最多一個 default 標籤。

括號裡的表示式會被計算一次,並和 case 標籤中的常數表示式做比較。如果表示式的值匹配其中的某個 case 常數,程式流就會跳轉到該 case 標籤後面的語句。如果沒有匹配的 case 常數,程式流就會跳轉到 default 標籤後的語句(如果存在 default 標籤)。

例 1 使用了 switch 語句來處理使用者所選的選單命令。

【例1】switch 語句
// 處理使用者所選擇的選單命令
// ---------------------------------------------------
// 宣告用到的其他函數
int menu( void );             // 輸出選單,並返回使用者鍵入的字元
void action1( void ),
     action2( void );
/* ... */
switch ( menu() )             // 根據menu()的結果跳轉
{
   case 'a':
   case 'A': action1();               // 執行動作1
             break;           // 不執行任何其他動作

   case 'b':
   case 'B': action2();       // 執行動作2
             break;           // 不執行預設的動作

   default:  putchar( 'a' ); // 如果沒有識別到任何命令,輸出一個警告資訊
}

case 和 defaul 標籤的語法如下:

case 常數:     語句
default:        語句


case 後的常數指的是常數表示式,它必須是整數型別。在一個特定的 switch 語句中,每個 case 常數都必須具有獨一無二的值,不可以重複。但是 switch 語句可以包含多個 case 標籤。

default 標籤是可選的,可以放在 switch 語句體內任何位置。如果沒有 default 標籤,並且沒有任何 case 常數符合 switch 語句控制表示式的計算結果,那麼 switch 語句體中的語句都不會執行。在這種情況下,程式流會轉而執行 switch 語句體後面的語句。

switch 語句體通常是一個從 case 標籤開始的語句塊。如果在第一個 case 標籤之前有語句,這些語句並不會被執行。

C 語言的標籤只用於標識程式流可能跳轉到的目的地。這些標籤本身對程式沒有影響。因此,從 switch 跳轉到第一個符合條件的 case 標籤之後,程式會繼續順序執行,不受其他標籤的影響。

如果在這個符合條件的 case 標籤之後,其他 case 標籤中的語句應該被忽略,就應該在所執行的最後一條語句後,加上 break 語句,使得程式流直接跳轉到 switch 語句體的後面。

如果需要在 switch 語句內宣告變數,那麼這些變數應該被宣告在巢狀的內部語句塊中,如下所示:
switch ( x )
{
   case C1: { int temp = 10;    // 宣告temp,僅為該case使用
              /* ... */
            }
            break;
   case C2:
            /* ... */
}

在 switch 表示式中,應用了整數提升。case 常數被轉換為匹配 switch 表示式計算結果的型別。

也可改用 else if 語句來實現 switch/case 語句效果。但是如果依據一個整數表示式的值來判斷程式流,則應該使用 switch/case 語句,這種方式可以提高程式碼的可閱讀性。