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

簡單來說, switch 後頭接一小括弧,小括弧內為一常數運算式,計算出常數值若與其後 case 的位標 (label) 相符,就會執行該 case 的陳述。 case 的位標也可以是常數運算式,不過通常直接用常數值。
如下列程式,假設有一位元編碼儲存在整數陣列 (array) data 之中,程式累計 0 與 1 各自出現的數目
| 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 個元素值,此為常數運算式。
由於情況只有 0 與 1 ,因此上列程式只用 0 與 1 兩個位標。另外第 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 ...
沒有留言:
張貼留言