← 目录 / 第四章 · 分支结构 / 4.4 switch 语句

4.4 switch 语句

当需要根据一个变量的多种具体取值分别处理时,switch 比多个 if-else 更清晰,结构也更整齐。

switch 语句

当需要根据一个变量的多种具体取值分别处理时,switch 比多个 if-else 更清晰,结构也更整齐。

4.4.1 switch 的基本结构

switch (表达式) // 表达式必须是整型或字符型
case 常量1: 执行对应代码 ; break;
case 常量2: 执行对应代码 ; break;
case 常量3: 执行对应代码 ; break;
default: 所有 case 都不匹配时执行(类似 else) ; break;

switch 的执行方式是:拿 switch 括号里表达式的值,依次和每个 case 后面的常量比较,找到第一个相等的就跳进去执行,遇到 break 就跳出整个 switch

📌
switch 的限制:只支持整型(intchar 等)或枚举类型表达式,不能用 floatdoublestringcase 后面的值也必须是编译期就能确定的常量,不能是变量。

4.4.2 break 与穿透陷阱

⚠️
break 非常关键:每个 case 结尾都要加 break,否则程序会继续执行下面的 case(称为"穿透",fall-through),大多数时候这是 bug!
C++ · 忘记 break 导致的意外穿透
1int x = 1;
2switch (x)
3{
4 case 1: // ⚠️ 忘记写 break
5 cout << "一\n";
6 case 2:
7 cout << "二\n";
8 break;
9}
10// x=1 时,实际输出"一"和"二"两行,而不是只输出"一"

由于 case 1: 没写 break,即使匹配上了 case 1,程序也会"顺流而下",接着把 case 2 里的代码也执行一遍,直到遇到下一个 breakswitch 结束为止。这是初学者最容易踩的坑。

4.4.3 故意穿透的应用

穿透大多数时候是 bug,但有一种情况下故意穿透非常实用——让多个 case 共享同一段代码,省去重复书写:

C++ · switch 示例(工作日判断)
1int day = 3;
2switch (day)
3{
4 case 1: // 故意穿透:1~5 共享同一输出
5 case 2:
6 case 3:
7 case 4:
8 case 5:
9 cout << "工作日\n";
10 break; // 到这里才退出
11 case 6:
12 case 7:
13 cout << "周末\n";
14 break;
15 default:
16 cout << "错误输入\n";
17 break;
18}
💡
default 的位置:default 是保底选项,当所有 case 都不匹配时执行,类似于 else。它可以放在 switch 内的任意位置,但习惯上放最后,保持代码整洁。

4.4.4 switch 与 if-else 的选择

switchif-else if-else 链在很多场景下可以互相替代,怎么选并不是随意的,取决于要判断的到底是什么:

🎯 优先用 switch 的场景
判断的是一个变量的若干个具体取值,比如菜单选项 1/2/3/4、星期几、字符是元音字母中的哪一个。分支一多,switch 的结构比一长串 else if 清晰得多。
📏 必须用 if-else 的场景
判断的是范围(比如成绩分等级 ≥90≥75……)、涉及浮点数/字符串比较,或者条件本身很复杂(需要 &&|| 组合)。这些 switch 完全做不到,只能用 if-else

4.4.5 常见陷阱与易错点

把本节内容汇总成几条最容易踩坑的规则:

1
忘记写 break:这是 switch 里最常见的错误,一旦漏写,程序会一直"穿透"执行到下一个 break 为止,而不是只执行匹配上的那个 case。养成写完 case 内容立刻补上 break 的习惯。
2
试图判断范围或浮点数:switch 只能判断"是否等于某个整数/字符常量",写不出"大于60小于90"这种范围判断,也不支持 float/double/string 作为判断表达式。范围判断必须用 if-else
3
忘记 default:虽然 default 不是必需的,但省略它意味着"所有 case 都不匹配"时 switch 什么都不做,容易掩盖输入了预期之外数据的情况。养成写上 default 分支的习惯,即使只是打印一条错误提示。
4
case 后面写了变量而不是常量:case 后面必须是编译期就能确定的常量(字面量或 const 常量),不能是普通变量,比如 case n:(n 是变量)会直接编译报错。