Skip to content

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 1case 2 后面的 break; 删掉,然后用户输入了 1,电脑会发生什么? 电脑匹配到 case 1 后,会输出“向北走”。由于没有 break 刹车,它会无视后面的 case 2 等条件,顺势滑下去,继续输出“向南走”、“向西走”,直到撞见下一个 break 才会停下!

💡 竞赛技巧:利用穿透效应 穿透效应大部分时候是 Bug,但有时候也可以巧妙利用。比如判断输入的月份是不是有 31 天的大月:

cpp
switch (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

  1. 只能判断整数或字符switch (x) 中的 x 不能是浮点数 (double)。
  2. 只能进行“等于”判断:你不能写 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:` 兜底哦!
💻 运行代码

C++ 在线评测沙盒

📥 标准输入 (cin):
📤 终端输出 (cout):