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;
}
编译后执行,结果如下
$ g++ u0503_1.cpp
$./a.out 复制代码
数据中有 7 个 0 和 9 个 1。
$
第 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;
}
编译后执行,结果如下
$ g++ u0503_2.cpp
$./a.out 复制代码
答:3
电子:2
我:1
○:7
于:3
其他: 39
$
default位标下的break其实可有可无,但习惯上每个case都有给一个break,所以default后加上break只是相对看起来整齐而已。