switch
的語法架構如下:
switch (變數名稱或運算式) {
case 符合數字或字元:
陳述句一;
break;
case 符合數字或字元:
陳述句二;
break;
default:
陳述三;
}
首先看看 switch
的括號,當中置放要取出數值的變數,取出數值之後,程式會開始與 case
設定的數字或字元比對,如果符合就執行以下的陳述句,直到遇到 break
後離開 switch
區塊,如果沒有符合的數值或字元,則會執行 default
後的陳述句,default
不一定需要,可以省去這個部份。
來看看〈if 條件判斷〉中的成績等級比對,如何使用 switch
來改寫:
#include <stdio.h>
int main(void) {
int score = 0;
int level = 0;
printf("輸入分數:");
scanf("%d", &score);
level = score / 10;
switch(level) {
case 10:
case 9:
puts("得 A");
break;
case 8:
puts("得 B");
break;
case 7:
puts("得 C");
break;
case 6:
puts("得 D");
break;
default:
puts("得 E(不及格)");
}
return 0;
}
執行結果:
輸入分數:85
得 B
在這個程式中,使用除法並取得運算後的商數,如果大於 90 的話,除以 10 的商數一定是 9 或 10(100 分時),在 case 10
中沒有任何的陳述,也沒有使用 break
,所以會繼續往下執行,直到遇到 break
離開 switch
,所以學生成績 100 分的話,也會顯示A的成 績等級;如果比對的條件不在 10 到 6 這些值的話,會執行 default
下的陳述,這表示商數小於 6,所以學生的成績等級就顯示為 E 了。
注意在 case
後的等號是冒號而不是分號,這是初學者很常輸入錯誤的符號;如果比對的是字元,記得加上單引號(''
),例如:
case 'A';
在 case
中若宣告並初始變數,以下是不合法的:
switch(v) {
case 1:
int x = 0; // error: a label can only be part of a statement and a declaration is not a statement
printf("%d\n", x);
break;
default:
printf("default\n");
break;
}
這是因為以上的程式碼中,default
與 case
屬於同一區塊,而初始可能被跳過,如果真的要在 case
中若宣告並初始變數,必須明確定義另一個區塊:
switch(v) {
case 1:
{
int x = 0;
printf("%d\n", x);
}
break;
default:
printf("default\n");
break;
}
如果比對的是一個數值範圍,在 gcc
編譯器的擴充還允許這樣的比對方式:
switch(i) {
case 1 ... 30:
// statements
case 31 ... 1000:
// statements
default:
// statements
}
如上所示範的,gcc
編譯器的擴充可以使用 ...
來設定一個範圍的數值,而不用連續地撰寫 case
來比對。