switch 條件判斷


switch是C++提供的條件判斷陳述式,它只能比較數值或字元,不過別以為這樣它就比if 來得沒用,使用適當的話,它可比if判斷式來得有效率;switch的語法架構如下:
switch (變數名稱或運算式) {
    case 符合數字或字元:
        陳述句一;
        break;
    case 符合數字或字元:
        陳述句二;
        break;
    default:
        陳述三;
}

首先看看switch的括號,當中置放您要取出數值的變數,取出數值之後,程式會開始與case中所設定的數字或字元作比對,如果符合就執行以下的陳述 句,直到遇到break後離開switch區塊,如果沒有符合的數值或字元,則會執行default後的陳述句,default不一定需要,您可以省去這 個部份。

來看看上一個範例的成績等級比對如何使用switch來改寫:

#include <iostream>
using namespace std;

int main() {
int score = 0;
int level = 0;

cout << "輸入分數:";
cin >> score;
level = score/10;

switch(level) {
case 10:
case 9:
cout << "得A" << endl;
break;
case 8:
cout << "得B" << endl;
break;
case 7:
cout << "得C" << endl;
break;
case 6:
cout << "得D" << endl;
break;
default:
cout << "得E(不及格)" << endl;
}

return 0;
}

執行結果:
輸入分數:85
得B

在這個程式中,您使用除法並取得運算後的商數,如果大於90的話,除以10的商數一定是9或10(100分時),在case 10中沒有任何的陳述,也沒有使用break,所以會繼續往下執行,直到遇到break離開switch為止,所以學生成績100分的話,也會顯示A的成 績等級;如果比對的條件不在10到6這些值的話,會執行default下的陳述,這表示商數小於6,所以學生的成績等級就顯示為E了。

注意在case後的等號是冒號而不是分號,這是個很常鍵錯的符號;如果您比對的是字元,則記得加上單引號(' '),例如:
case 'A';

這個程式與使用if來判斷成績等級的程式有何不同?如果純綷比對數字或字元的話,建議使用switch,因為它只會在一開始的switch括號中取出變數 值一次,然後將這個值與下面所設定的case比對,但如果您使用if的話,每次遇到條件式時,都要取出變數值,效率的差異就在這,例如:
if(a == 1)
    // ....
else if(a == 2)
    // ....
else if(a == 3)
    // ....

這個程式片段中我們在最差的狀況下,也就是a = 3時,共需三次比對,而每次比對都必須取出變數a的值一次,如果換成switch的話:
switch(a) {
    case 1:
        // ..
        break;
    case 2:
        // ..
        break;
    case 3:
        // ..
        break;
}

在這個程式片段中,只在一開頭switch的括號中取出變數a的值,然後逐一比對下面的case,效率的差別就在於這邊。

當然並不是使用if就不好,遇到複合條件時,switch就幫不上忙了,您無法在switch中組合複雜的條件陳述,這時就得使用if了,簡單的說,if 與switch兩者可以搭配著靈活使用。

如果您比對的是一個數值範圍,在gcc的C++編譯器中還允許這樣的比對方式:
switch(i) {
    case 1 ... 30:
        // statements
    case 31 ... 1000:
        // statements
    default:
        // statements
}

如上所示範的,您可以使用...來設定一個範圍的數值,而不用連續的撰寫case來比對。