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 語句,這種方式可以提高程式碼的可閱讀性。