简介
C++语言提供了两种按照条件执行的语句:
- if语句:根据条件决定控制流
- switch语句:计算整型表达式的值,并根据这个值从几条执行路径中选择一条
switch语句
1. 例子:统计每个元音字母的数量
unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0;char ch;while (cin >> ch) {switch (ch) {case 'a':++aCnt;break;case 'e':++eCnt;break;case 'i':++iCnt;break;case 'o':++oCnt;break;case 'u':++uCnt;break;}}
2. case标签
- case标签必须是整型常量表达式
- 任意两个case标签的值不能相同
- 如果某个case标签匹配成功,将从该标签开始往后顺序执行所有case分支,直到遇到break语句
- 可以把多个case标签写在同一行内,强调这些case表示的是某个范围内的值
// 统计元音字母出现次数unsigned vowelCnt = 0;char ch;while (cin >> ch) {switch (ch) {case 'a': case 'e': case 'i': case 'o': case 'u':++vowelCnt;break;}}
3. break
一般不要省略case分支最后的break语句,如果没写break语句,最好加一段注释说明程序的逻辑,否则可能带来非预期的结果。
4. default标签
Tips:标签不应该孤零零存在,它后面必须跟上一条语句或者另外一个case标签。如果switch结构以一个空的default标签作为接受,则该default标签后面必须跟上一条空语句或者一个空块。
如果没有任何一个case标签能匹配上switch表达式的值,那么程序将执行紧跟在default标签后面的语句:
// 统计元音字母和非元音字母出现次数unsigned vowelCnt = 0;unsigned otherCnt = 0;char ch;while (cin >> ch) {switch (ch) {case 'a': case 'e': case 'i': case 'o': case 'u':++vowelCnt;break;default:++otherCnt;break;}}
4. switch内部的变量定义
switch的执行流程中可能会跨过某些case标签,如果需要为某个case分支定义并初始化一个变量,我们应该把变量定义在块内,从而保证后面所有case标签都在变量的作用域之外:
case true:{string file_name = get_file_name();}break;case false:// 编译报错: file_name不在作用域之内if (file_name.empty())
