CC++ & Algorithm

C++ switch 语句基础

中等60
语言版本:C++Python
概述:学习 switch 语句,它像一个多路开关,根据一个整数的值跳转到不同分支,适用于判断相等的情况。

用 switch 语句做“多路选择”——就像电梯按钮和遥控器

你有没有用过遥控器?按数字键 1 看新闻,按 2 看动画片,按 3 看电影。或者坐电梯时,按几楼电梯就去几楼。C++ 里也有一款专门做这种“根据一个值跳到不同位置”的工具,叫作 switch 语句。它根据一个整数(或字符)的值,直接跳到对应的分支去执行代码,比用一堆 if-else 更清晰、更方便。


switch 的语法长什么样?

switch (变量) {
    case1:
        // 当变量 == 值1 时执行的代码
        break;
    case2:
        // 当变量 == 值2 时执行的代码
        break;
    // 可以有很多 case
    default:
        // 当变量不匹配任何 case 时执行的代码
        break;
}

几个重要的要求

  • 变量必须是整数类型,比如 intchar(字符也是整数),不能是小数或字符串。
  • case 后面只能写一个 常量值,比如 5'a'2 + 3 这种固定值,不能写变量或表达式。
  • 每个 case 最后一般要加 break;,意思是“跳出整个 switch 结构”。如果不加,程序会继续往下跑后面的 case(这叫“穿透”)。
  • default 是可选的,用来处理所有不匹配的情况,相当于“其他”。

生活中的例子:遥控器选台

假设我们做一个简易的“电视遥控器”程序:
输入 1 → 播放新闻,输入 2 → 播放动画,输入 3 → 播放电影,输入其他 → 提示无此频道。

#include <iostream>
using namespace std;
int main() {
    int channel;          // 频道号
    cout << "请输入频道号(1-3):";
    cin >> channel;
    switch (channel) {
        case 1:
            cout << "现在播放:新闻联播" << endl;
            break;
        case 2:
            cout << "现在播放:熊出没" << endl;
            break;
        case 3:
            cout << "现在播放:流浪地球" << endl;
            break;
        default:
            cout << "没有这个频道哦!" << endl;
            break;
    }
    return 0;
}

如果输入 2,程序直接跳到 case 2,输出“现在播放:熊出没”,然后遇到 break 跳出 switch。如果输入 5,所有 case 都不匹配,就执行 default


break 的作用和“穿透”现象

break 就像一堵墙,挡住程序继续往下走。如果不写 break,会发生什么?

比如下面的代码:

#include <iostream>
using namespace std;
int main() {
    int num = 1;
    switch (num) {
        case 1:
            cout << "进入 case 1" << endl;
            // 没有 break
        case 2:
            cout << "进入 case 2" << endl;
            break;
        default:
            cout << "进入 default" << endl;
    }
    return 0;
}

输出是:

进入 case 1
进入 case 2

因为 case 1 没有 break,执行完 case 1 后不会跳出 switch,而是直接“穿透”到 case 2 继续执行。这就是 switch 的穿透(fall-through) 特性。

巧妙利用穿透:当多个 case 需要执行相同的代码时,可以把它们写在一起(不写 break),最后只放一个 break。比如判断元音字母的例子:

char ch;            // 输入的字母
cin >> ch;
switch (ch) {
    case 'a':
    case 'e':
    case 'i':
    case 'o':
    case 'u':
        cout << "元音" << endl;
        break;      // 五个 case 都执行这一句后跳出
    default:
        cout << "辅音" << endl;
        break;
}

这里 case 'a' 执行后没有 break,就继续执行 case 'e'……直到遇到 case 'u' 后面的 break 才跳出。所以不管输入 a、e、i、o、u 哪一个,都会输出“元音”。


实战:根据月份输出天数(不含闰年)

这是一个经典练习题。一年 12 个月,天数分别是:

  • 31 天:1、3、5、7、8、10、12 月
  • 30 天:4、6、9、11 月
  • 28 天:2 月

利用 switch 的穿透特性,我们可以把相同天数的月份放在一起,只用几个 break 就搞定。

#include <iostream>
using namespace std;
int main() {
    int month;          // 月份
    cout << "请输入月份(1-12):";
    cin >> month;
    switch (month) {
        case 1:
        case 3:
        case 5:
        case 7:
        case 8:
        case 10:
        case 12:
            cout << "31 天" << endl;
            break;
        case 4:
        case 6:
        case 9:
        case 11:
            cout << "30 天" << endl;
            break;
        case 2:
            cout << "28 天(非闰年)" << endl;
            break;
        default:
            cout << "月份输入错误!" << endl;
            break;
    }
    return 0;
}

这样写即简洁又直观,比用 if-else 写一堆条件判断要清爽得多。


新手最容易犯的三个错误

  1. 忘记写 break 导致意外穿透
    比如写了一个星期几的程序,每个 case 后面忘了 break,那么输入 1 会输出“周一”“周二”……直到遇到 break 为止。结果乱成一锅粥。
    ✅ 每个 case 最后务必习惯性加上 break(除非你故意利用穿透)。

  2. case 后面的值重复

    switch (score) {
        case 90: cout << "优秀"; break;
        case 90: cout << "你咋又来了"; break;  // 错误!同一个值不能出现两次
    }
    

    编译器会报错。每个 case 的值必须是唯一的。

  3. case 后面写变量或表达式

    int limit = 10;
    switch (x) {
        case limit: // 错误!case 后面必须是常量,不能是变量
    }
    

    ✅ 只能用常量,比如 5'A'1+2(结果是常数)等。


什么时候用 switch,什么时候用 if-else?

switch 擅长 判断一个变量是否等于某几个固定值,比如星期、月份、选项编号。
if-else 更灵活,可以处理范围判断(比如分数 >= 60)、多种条件组合(且、或)等。

// 范围判断用 if
if (score >= 90) cout << "优秀";
else if (score >= 60) cout << "及格";
else cout << "不及格";

// 固定值判断用 switch
switch (grade) {
    case 'A': cout << "90分以上"; break;
    case 'B': cout << "80-89分"; break;
    default: cout << "其他"; break;
}

一个常见的坑:如果条件只是判断值是否相等(不是大于小于),并且只有 3 个以上的分支,用 switch 会让代码更清晰。


完整示例:用 switch 写一个简单的自动售货机

小明有一台售货机,饮料编号如下:
1 – 可乐 3 元,2 – 雪碧 3 元,3 – 果汁 5 元,4 – 矿泉水 2 元。
输入编号,输出饮料名称和价格。

#include <iostream>
using namespace std;
int main() {
    int choice;             // 选择编号
    cout << "=== 自动售货机 ===" << endl;
    cout << "1. 可乐(3元)" << endl;
    cout << "2. 雪碧(3元)" << endl;
    cout << "3. 果汁(5元)" << endl;
    cout << "4. 矿泉水(2元)" << endl;
    cout << "请选择(1-4):";
    cin >> choice;

    switch (choice) {
        case 1:
            cout << "您选择了可乐,请支付 3 元。" << endl;
            break;
        case 2:
            cout << "您选择了雪碧,请支付 3 元。" << endl;
            break;
        case 3:
            cout << "您选择了果汁,请支付 5 元。" << endl;
            break;
        case 4:
            cout << "您选择了矿泉水,请支付 2 元。" << endl;
            break;
        default:
            cout << "没有这个商品,请重新选择!" << endl;
            break;
    }
    return 0;
}

相关知识点指引

  • if-else 选择结构:switch 的“好搭档”,可以处理范围或复杂条件。
  • 循环结构:可以把 switch 放在 whilefor 里面,做成多次选单。
  • break 语句:不只在 switch 里用,在循环里也能用,表示提前结束循环。
  • 枚举类型:未来你会学到 enum,可以用有含义的名字代替数字,让 switch 更易读。

switch 语句就像班级里老师按学号点名:喊到什么号,对应的人就起立。代码也是,根据不同的值“跳”到不同的位置去执行任务。掌握它,你的程序就更像一个精准的“自动导航仪”了!

例题精讲

1单选题

在C++中,switch语句后面的表达式必须是以下哪种类型?

A整型(包括字符型)
B浮点型
C字符串
D任意类型
2判断题

如果switch语句中某个case后面没有break,程序会继续执行后续case的代码,直到遇到break或switch语句结束。

3填空题
以下代码根据星期数(1~7)输出英文名称,但缺失了关键部分。请在___处填写正确的语句。

int day = 3;
switch(day) {
    case 1: cout << "Monday"; ___;
    case 2: cout << "Tuesday"; break;
    case 3: cout << "Wednesday"; break;
    default: cout << "Other";
}
4单选题

以下关于switch语句中default分支的说法,正确的是?

Adefault必须放在所有case之后
Bdefault可以省略不写
Cdefault只能出现一次,且必须包含break
Ddefault与case的作用完全相同
5填空题
以下代码根据成绩等级输出评语,请补全case标签部分。

char grade = 'B';
switch(grade) {
    ___ cout << "良好"; break;
    case 'A': cout << "优秀"; break;
    default: cout << "继续努力";
}