C++ 速查手冊
5.3 - switch 陳述
C++ 使用關鍵字 switch 、 case 、 default 對一個常數執行不同的分流,這構成多重選擇的結構,形式如下
簡單來說, switch 後頭接一小括弧,小括弧內為一常數運算式,計算出常數值若與其後 case 的位標 (label) 相符,就會執行該 case 的陳述。 case 的位標也可以是常數運算式,不過通常直接用常數值。
如下列程式,假設有一位元編碼儲存在整數陣列 (array) data 之中,程式累計 0 與 1 各自出現的數目
#include <iostream>
int main() {
int data[] = {1, 0 ,0, 1, 0, 1, 1, 0, 1, 1, 1, 0, 0, 0, 1, 1};
int one_count = 0;
int zero_count = 0;
int i;
for (i = 0; i <= 15; i++) {
switch (data[i]) {
case 0:
zero_count++;
break;
case 1:
one_count++;
break;
}
}
std::cout << "There are " << zero_count;
std::cout << " 0s, and " << one_count;
std::cout << " 1s in data." << std::endl;
return 0;
}
/* 《程式語言教學誌》的範例程式
http://kaiching.org/
檔名:u0503_1.cpp
功能:示範 C++ 的 switch 陳述
作者:張凱慶*/
編譯後執行,結果如下
$ g++ u0503_1.cpp |
$ ./a.out |
There are 7 0s, and 9 1s in data. |
$ |
第 10 行
switch (data[i]) {
data[i] 會取得該陣列的第 i 個元素值,此為常數運算式。
由於情況只有 0 與 1 ,因此上列程式只用 0 與 1 兩個位標。另外第 13 行及第 17 行都有
break;
關鍵字 break 是用來暫時中斷程式的執行,放在迴圈內遇到 break 就會跳出迴圈,而在 switch 裡頭的位標後面則是可以不讓程式繼續往下檢查其他的位標,因為檢查到相符的位標,程式即可暫停,若是沒有用 break ,程式會持續執行到右大括弧 } ,也就是 switch 陳述結束的地方,這樣容易增加額外的程式執行時間。
以下程式計算字串中母音字母出現的次數,若非母音字母則用 default 位標執行另外的計算
#include <iostream>
int main() {
char saying[] = {'N', 'e', 'v', 'e', 'r', ' ', 'p', 'u',
't', ' ', 'o', 'f', 'f', ' ', 't', 'i',
'l', 'l', ' ', 't', 'o', 'm', 'o', 'r',
'r', 'o', 'w', ' ', 'w', 'h', 'a', 't',
' ', 'y', 'o', 'u', ' ', 'c', 'a', 'n',
' ', 'd', 'o', ' ', 't', 'o', 'd', 'a',
'y', '.'};
int aV, eV, iV, oV, uV, other, i;
aV = eV = iV = oV = uV = 0;
other = i = 0;
while (saying[i] != '\0') {
switch(saying[i]) {
case 'A': case 'a':
aV++;
break;
case 'E': case 'e':
eV++;
break;
case 'I': case 'i':
iV++;
break;
case 'O': case 'o':
oV++;
break;
case 'U': case 'u':
uV++;
break;
default:
other++;
break;
}
i++;
}
std::cout << "a: " << aV;
std::cout << std::endl;
std::cout << "e: " << eV;
std::cout << std::endl;
std::cout << "i: " << iV;
std::cout << std::endl;
std::cout << "o: " << oV;
std::cout << std::endl;
std::cout << "u: " << uV;
std::cout << std::endl;
std::cout << "other: " << other;
std::cout << std::endl;
return 0;
}
/* 《程式語言教學誌》的範例程式
http://kaiching.org/
檔名:u0503_2.cpp
功能:示範 C++ 的 switch 陳述
作者:張凱慶*/
編譯後執行,結果如下
$ g++ u0503_2.cpp |
$ ./a.out |
a: 3 |
e: 2 |
i: 1 |
o: 7 |
u: 3 |
other: 39 |
$ |
default 位標下的 break 其實可有可無,但習慣上每個 case 都有給一個 break ,所以 default 後加上 break 只是相對看起來整齊而已。
各 case 的位標或 default 的出現順序並沒有強制規定,但習慣上, default 會放在最後面。
相關教學影片