發新話題

C++ Gossip 流程控制 - switch 條件判斷

C++ Gossip 流程控制 - 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 = (int) 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來比對。

TOP

發新話題

本站所有圖文均屬網友發表,僅代表作者的觀點與本站無關,如有侵權請通知版主會盡快刪除。