C++ 速查手冊 V1.00 - 單元 5.3 - switch 陳述




C++ 使用關鍵字 switchcasedefault 對一個常數執行不同的分流,這構成多重選擇的結構,形式如下



簡單來說, switch 後頭接一小括弧,小括弧內為一常數運算式,計算出常數值若與其後 case 的位標 (label) 相符,就會執行該 case 的陳述。 case 的位標也可以是常數運算式,不過通常直接用常數值。


如下列程式,假設有一位元編碼儲存在整數陣列 (array) data 之中,程式累計 01 各自出現的數目


001 #include <iostream>
002
003 int main() {
004    int data[] = {1, 0 ,0, 1, 0,
005                  1, 1, 0, 1, 1,
006                  1, 0, 0, 0, 1,
007                  1};
008    int one_count = 0;
009    int zero_count = 0;
010    int i;
011
012    for (i = 0; i <= 15; i++) {
013       switch (data[i]) {
014          case 0: zero_count++;
015                  break;
016
017          case 1: one_count++;
018                  break;
019       }
020    }
021
022    std::cout << "There are " 
023              << zero_count;
024    std::cout << " 0s, and " 
025              << one_count;
026    std::cout << " 1s in data." 
027              << std::endl
028
029    return 0;
030 }
031  
032 /* Kaiching Chang 
033    u0503_1.cpp
034    2014-02 */

編譯後執行,結果如下


$ g++ u0503_1.cpp
$ ./a.out
There are 7 0s, and 9 1s in data.
$

第 13 行


013 switch (data[i]) {

data[i] 會取得該陣列的第 i 個元素值,此為常數運算式。


由於情況只有 01 ,因此上列程式只用 01 兩個位標。另外第 15 行及第 18 行都有


015 break;

關鍵字 break 是用來暫時中斷程式的執行,放在迴圈內遇到 break 就會跳出迴圈,而在 switch 裡頭的位標後面則是可以不讓程式繼續往下檢查其他的位標,因為檢查到相符的位標,程式即可暫停,若是沒有用 break ,程式會持續執行到右大括弧 } ,也就是 switch 陳述結束的地方,這樣容易增加額外的程式執行時間。


以下程式計算字串中母音字母出現的次數,若非母音字母則用 default 位標執行另外的計算


001 #include <iostream>
002
003 int main() {
004    char saying[] = {'N''e''v''e',
005                     'r'' ''p''u',
006                     't'' ''o''f',
007                     'f'' ''t''i',
008                     'l''l'' ''t',
009                     'o''m''o''r',
010                     'r''o''w'' ',
011                     'w''h''a''t',
012                     ' ''y''o''u',
013                     ' ''c''a''n',
014                     ' ''d''o'' ',
015                     't''o''d''a',
016                     'y''.'};
017    int aV, eV, iV, oV, uV, other, i;
018    aV = eV = iV = oV = uV = 0;
019    other = i = 0; 
020         
021    while (saying[i] != '\0') {
022       switch(saying[i]) {
023          case 'A'case 'a':
024             aV++;
025             break;
026                 
027          case 'E'case 'e':
028             eV++;
029             break;
030                 
031          case 'I'case 'i':
032             iV++;
033             break;
034             
035          case 'O'case 'o':
036             oV++;
037             break;
038             
039          case 'U'case 'u':
040             uV++;
041             break;
042                 
043          default:
044             other++;
045             break;
046       }
047         
048       i++;
049    }
050     
051    std::cout << "a: " << aV;
052    std::cout << std::endl;
053    std::cout << "e: " << eV;
054    std::cout << std::endl;
055    std::cout << "i: " << iV;
056    std::cout << std::endl;
057    std::cout << "o: " << oV;
058    std::cout << std::endl;
059    std::cout << "u: " << uV;
060    std::cout << std::endl;
061    std::cout << "other: " 
062              << other;
063    std::cout << std::endl
064
065    return 0;
066 }
067  
068 /* Kaiching Chang 
069    u0503_2.cpp
070    2014-02 */

編譯後執行,結果如下


$ g++ u0503_2.cpp
$ ./a.out
a: 3
e: 2
i: 1
o: 7
u: 3
other: 36
$

default 位標下的 break 其實可有可無,但習慣上每個 case 都有給一個 break ,所以 default 後加上 break 只是相對看起來整齊而已。


case 的位標或 default 的出現順序並沒有強制規定,但習慣上, default 會放在最後面。


continue ...

沒有留言: