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只是相对看起来整齐而已。