简介

C++语言提供了两种按照条件执行的语句:

  • if语句:根据条件决定控制流
  • switch语句:计算整型表达式的值,并根据这个值从几条执行路径中选择一条

switch语句

1. 例子:统计每个元音字母的数量

  1. unsigned aCnt = 0, eCnt = 0, iCnt = 0, oCnt = 0, uCnt = 0;
  2. char ch;
  3. while (cin >> ch) {
  4. switch (ch) {
  5. case 'a':
  6. ++aCnt;
  7. break;
  8. case 'e':
  9. ++eCnt;
  10. break;
  11. case 'i':
  12. ++iCnt;
  13. break;
  14. case 'o':
  15. ++oCnt;
  16. break;
  17. case 'u':
  18. ++uCnt;
  19. break;
  20. }
  21. }

2. case标签

  • case标签必须是整型常量表达式
  • 任意两个case标签的值不能相同
  • 如果某个case标签匹配成功,将从该标签开始往后顺序执行所有case分支,直到遇到break语句
  • 可以把多个case标签写在同一行内,强调这些case表示的是某个范围内的值
  1. // 统计元音字母出现次数
  2. unsigned vowelCnt = 0;
  3. char ch;
  4. while (cin >> ch) {
  5. switch (ch) {
  6. case 'a': case 'e': case 'i': case 'o': case 'u':
  7. ++vowelCnt;
  8. break;
  9. }
  10. }

3. break

一般不要省略case分支最后的break语句,如果没写break语句,最好加一段注释说明程序的逻辑,否则可能带来非预期的结果。

4. default标签

Tips:标签不应该孤零零存在,它后面必须跟上一条语句或者另外一个case标签。如果switch结构以一个空的default标签作为接受,则该default标签后面必须跟上一条空语句或者一个空块。

如果没有任何一个case标签能匹配上switch表达式的值,那么程序将执行紧跟在default标签后面的语句:

  1. // 统计元音字母和非元音字母出现次数
  2. unsigned vowelCnt = 0;
  3. unsigned otherCnt = 0;
  4. char ch;
  5. while (cin >> ch) {
  6. switch (ch) {
  7. case 'a': case 'e': case 'i': case 'o': case 'u':
  8. ++vowelCnt;
  9. break;
  10. default:
  11. ++otherCnt;
  12. break;
  13. }
  14. }

4. switch内部的变量定义

switch的执行流程中可能会跨过某些case标签,如果需要为某个case分支定义并初始化一个变量,我们应该把变量定义在块内,从而保证后面所有case标签都在变量的作用域之外:

  1. case true:
  2. {
  3. string file_name = get_file_name();
  4. }
  5. break;
  6. case false:
  7. // 编译报错: file_name不在作用域之内
  8. if (file_name.empty())