Appearance
8. switch 语句:多选一的利器
前置学习:if-else 分支
当你面临大量“点对点”的精确匹配时(例如:输入 1 打印星期一,输入 2 打印星期二... 直到 7),如果写一长串的 if ... else if ...,代码会变得非常臃肿。
这时候,C++ 提供了另一个优雅的工具:switch 语句(像一个点菜的菜单)。
1. switch 的标准语法
我们来看一个具体的例子:根据用户输入的数字,输出对应的方向。
cpp
int dir;
cin >> dir;
switch (dir) {
case 1:
cout << "向北走" << endl;
break; // 关键:执行完后立刻跳出 switch
case 2:
cout << "向南走" << endl;
break;
case 3:
cout << "向西走" << endl;
break;
case 4:
cout << "向东走" << endl;
break;
default:
// 如果上面所有的 case 都没有匹配中,就执行 default
cout << "输入错误,原地发呆" << endl;
break;
}2. 💀 致命陷阱:漏写 break 会怎样?(穿透效应)
在 switch 语句中,break; 的作用是“踩刹车”。如果不写 break,电脑会发生可怕的穿透效应 (Fall-through)。
假设我们把上面代码中 case 1 和 case 2 后面的 break; 删掉,然后用户输入了 1,电脑会发生什么? 电脑匹配到 case 1 后,会输出“向北走”。由于没有 break 刹车,它会无视后面的 case 2 等条件,顺势滑下去,继续输出“向南走”、“向西走”,直到撞见下一个 break 才会停下!
💡 竞赛技巧:利用穿透效应 穿透效应大部分时候是 Bug,但有时候也可以巧妙利用。比如判断输入的月份是不是有 31 天的大月:
cppswitch (month) { case 1: case 3: case 5: case 7: case 8: case 10: case 12: cout << "这个月有 31 天"; // 这 7 个月份共用同一个结果 break; // ... 其他月份 }
3. switch 的局限性
虽然 switch 看起来很整洁,但它有严格的限制,所以在 OI 赛场上它的出场率远不如 if-else:
- 只能判断整数或字符:
switch (x)中的x不能是浮点数 (double)。 - 只能进行“等于”判断:你不能写
case >= 90:这种范围判断。处理范围,只能老老实实去写if-else。
4. 动手实践
md
1. 打开左下角的代码沙盒。
2. 编写一个“简易计算器”:
- 输入两个整数 `a`, `b` 和一个代表操作的数字 `op` (1代表加,2代表减,3代表乘)。
- 使用 `switch (op)`,根据 `op` 的值,分别输出 `a+b`、`a-b` 或 `a*b` 的结果。
- 不要忘了写 `break;` 和 `default:` 兜底哦!