CC++ & Algorithm

C++ switch 语句

困难19
语言版本:C++Python
概述:学习switch语句,让程序根据某个整数的不同取值,像分岔路口的指示牌一样,选择不同的执行路径。

C++ switch 语句:多路选择的“菜单”与“转盘”

当我们写程序时,常常要根据一个变量的不同取值,去执行不同的操作。比如:

  • 根据考试分数,输出“优秀”、“良好”、“及格”或“不及格”。
  • 根据输入的数字1~7,输出对应的星期英文名。
  • 根据用户选择的菜单编号(1~4),进入不同的功能模块。

如果只有两三种情况,用 if-else 很方便。但如果要判断的情况很多(比如7种、12种),用一连串的 if-else if 就会变得又长又乱,就像在一条有很多岔路的路上,需要不停地问“是不是这个?是不是那个?”。C++ 为我们准备了一种更清晰、更高效的结构——switch 语句

switch 语句就像一个大转盘,转盘上有许多小格子,每个格子上标着一个数字或字符。你拿一个令牌(一个表达式的值)往转盘上一放,指针就会“啪”地指向对应的格子,然后执行那个格子里的指令。如果令牌上的值没有匹配的格子,就会执行一个备用的“default”格子。


一、switch 语句的基本格式

switch (表达式) {
    case1:
        // 当表达式 == 值1时执行的代码
        break;
    case2:
        // 当表达式 == 值2时执行的代码
        break;
    // ... 可以有任意多个 case
    default:
        // 当表达式的值不在以上任何 case 中时执行的代码
        break;
}

解释:

  • 表达式:通常是一个整数、字符(char)或枚举类型的变量。注意:它不能是浮点数(如 3.14)或字符串(如 "hello")。
  • case:后面跟一个常量(具体数值或字符),然后用冒号结束。例如 case 1:case 'A':
  • break非常重要!它告诉程序“执行完这个 case 里的代码后,立刻跳出 switch 结构”。如果没有 break,程序会继续往下执行下一个 case 里的代码,这叫 “穿透”(fall-through)
  • default:可选项,用来处理“所有 case 都不匹配”的情况。就像菜单末尾的“其他需求”,可以放在 switch 体的末尾,也可以放在中间(但通常放在最后)。

生活中的例子:假设你在奶茶店点单,菜单上有1~5号饮品。你喊“我要3号”,店员就去准备3号饮品(匹配到 case 3),然后结账(break),不再看后面的号码。如果你喊了一个不存在的8号,店员就会说“抱歉没有这个选项”(执行 default)。


二、switch 与 if-else 的对比

对比项switch 语句if-else if 链
适用条件判断一个整型/字符表达式是否等于几个固定常量可以判断范围(如 score >= 90)、逻辑组合
可读性当分支较多时,结构清晰,像看菜单分支一多, else if 长长一串,容易眼花
性能编译器通常会生成跳转表,多个分支时更快逐个条件判断,速度稍慢(但现代编译器差异不大)
限制表达式只能是整型、字符型或枚举型;case 后面必须是常量没有限制,任何布尔表达式都行

总结:当你要根据一个整数或字符的具体取值(而不是范围)做判断,并且有3个以上分支时,推荐用 switch。如果判断的是范围(比如分数段),或者需要复杂的条件(如 &&||),还是要用 if-else。


三、更多生活中的例子

例子1:根据输入的数字输出对应的零食名称

#include <iostream>
using namespace std;

int main() {
    int choice;      // 用户选择的零食编号
    cout << "请选择零食(1-巧克力 2-薯片 3-糖果 4-饼干):";
    cin >> choice;
    
    switch (choice) {
        case 1:
            cout << "你选了巧克力,好好吃!" << endl;
            break;
        case 2:
            cout << "你选了薯片,咔嚓咔嚓!" << endl;
            break;
        case 3:
            cout << "你选了糖果,甜甜的!" << endl;
            break;
        case 4:
            cout << "你选了饼干,脆脆的!" << endl;
            break;
        default:
            cout << "没有这个选项,请重新选择1~4。" << endl;
            break;
    }
    return 0;
}

例子2:根据考试成绩等级输出评语(用字符作为表达式)

假设我们输入一个大写字母代表等级:'A'、'B'、'C'、'D'、'F'。

#include <iostream>
using namespace std;

int main() {
    char grade;      // 考试成绩等级
    cout << "请输入你的等级(A/B/C/D/F):";
    cin >> grade;
    
    switch (grade) {
        case 'A':
            cout << "太棒了,继续保持!" << endl;
            break;
        case 'B':
            cout << "不错,还可以更好。" << endl;
            break;
        case 'C':
            cout << "刚刚及格,加把劲。" << endl;
            break;
        case 'D':
            cout << "需要更努力哦。" << endl;
            break;
        case 'F':
            cout << "不及格,请认真复习。" << endl;
            break;
        default:
            cout << "输入无效,请输入A~F之间的字母。" << endl;
            break;
    }
    return 0;
}

注意case 'A' 中的 'A' 是字符常量,必须用单引号括起来。


四、新手容易犯的错误

4.1 忘记写 break,导致“穿透”

这是最经典、最常见的错误。没有 break 时,程序会继续执行下一个 case 中的代码,直到遇到 break 或 switch 结束。

例子: 下面的代码无论输入1还是2,都会输出“你的数字是1~3”。

int num = 1;   // 数字
switch (num) {
    case 1:
        cout << "你的数字是1" << endl;
        // 忘记 break!
    case 2:
        cout << "你的数字是2" << endl;
        break;
    case 3:
        cout << "你的数字是3" << endl;
        break;
}
// 输出:
// 你的数字是1
// 你的数字是2

因为 case 1 里没有 break,执行完 cout 后,程序“穿透”到 case 2,继续执行,直到遇到 case 2 中的 break 才停下。

什么时候故意不用 break? 有时候我们想让多个 case 共享同一段代码,比如星期一到星期五都是上课日,星期天是休息日:

switch (day) {
    case 1:    // 星期一
    case 2:    // 星期二
    case 3:    // 星期三
    case 4:    // 星期四
    case 5:    // 星期五
        cout << "今天是上课日" << endl;
        break;
    case 6:    // 星期六
    case 7:    // 星期天
        cout << "今天是休息日" << endl;
        break;
}

这里 case 1case 5 都没有 break,所以无论输入1~5哪个数字,都会直接“穿透”到 case 5 后的代码并执行,然后遇到 break 才跳出。这是合法的用法,但需要非常清楚自己在干什么。

4.2 case 后面忘记加冒号

case 1   // 错误:漏掉了冒号
    cout << "Hello" << endl;
    break;

编译器会报错。正确写法是 case 1:

4.3 case 后面的值重复

同一个 switch 中不能有两个相同的 case 值,例如:

switch (x) {
    case 1:
        // ...
        break;
    case 1:   // 错误!重复
        // ...
        break;
}

4.4 在 case 中定义变量(未加大括号)

如果需要在某个 case 中定义一个新的变量,最好用大括号 {} 包裹起来,否则可能会引起编译错误。

switch (x) {
    case 1:
        int y = 10;   // 可能报错:跳过了变量初始化
        break;
    case 2:
        // ...
        break;
}

解决:加上大括号:

case 1: {
    int y = 10;   // 用大括号限定作用域
    cout << y << endl;
    break;
}

五、完整可运行的代码示例

以下程序模拟一个简单的计算器:输入两个整数和一个运算符(+、-、*、/),输出计算结果。我们用 switch 来判断运算符。

#include <iostream>
using namespace std;

int main() {
    double num1, num2;    // 两个操作数(用 double 支持除法)
    char op;              // 运算符:+ - * /
    
    cout << "请输入第一个数字:";
    cin >> num1;
    cout << "请输入运算符(+ - * /):";
    cin >> op;
    cout << "请输入第二个数字:";
    cin >> num2;
    
    switch (op) {
        case '+':
            cout << num1 << " + " << num2 << " = " << num1 + num2 << endl;
            break;
        case '-':
            cout << num1 << " - " << num2 << " = " << num1 - num2 << endl;
            break;
        case '*':
            cout << num1 << " * " << num2 << " = " << num1 * num2 << endl;
            break;
        case '/':
            if (num2 != 0) {   // 避免除数为0
                cout << num1 << " / " << num2 << " = " << num1 / num2 << endl;
            } else {
                cout << "错误:除数不能为0!" << endl;
            }
            break;
        default:
            cout << "无效的运算符,请输入 + - * / 之一。" << endl;
            break;
    }
    return 0;
}

运行示例:

请输入第一个数字:10
请输入运算符(+ - * /):/
请输入第二个数字:3
10 / 3 = 3.33333

如果输入了不支持的运算符(比如 %),则会进入 default 分支,输出错误提示。


六、相关知识点指引

  • if-else 语句:当判断条件是范围或逻辑组合时,if-else 更灵活。建议先掌握 if-else,再用 switch 简化特定场景。
  • break 与 continue:switch 中的 break 是跳出 switch 结构;循环中的 break 是跳出循环。别混淆哦!
  • 字符与整型char 类型本质上是一个小整数(ASCII 码),所以 case 'A' 相当于 case 65(ASCII 值),switch 也支持字符比较。
  • 枚举类型 (enum):可以定义一组命名的整数常量,配合 switch 使用会让代码更加清晰。例如 enum Weekday {MON, TUE, WED, THU, FRI, SAT, SUN}; 然后 switch (today) 中可以直接写 case MON:

学会 switch 语句后,你会发现处理多分支选择就像翻菜单一样简单。下次遇到需要根据一个数字或字符做不同事情的程序,试试用 switch 吧!

例题精讲

1单选题

在C++中,switch语句的表达式必须是什么类型?

A浮点型
B整型或字符型
C字符串型
D布尔型
2单选题

在C++的switch语句中,break关键字的作用是什么?

A结束整个程序
B跳出当前switch结构,继续执行switch后面的代码
C跳转到下一个case继续执行
D跳出循环
3判断题

在C++的switch语句中,每个case后面的表达式必须是常量表达式,且同一switch中不能出现重复的case常量。

4填空题
以下程序根据输入的数字1~7输出对应的星期几(1=Monday,2=Tuesday,…,7=Sunday)。请补全switch语句。

#include <iostream>
using namespace std;
int main() {
    int day;
    cin >> day;
    ___ {
        case 1: cout << "Monday"; break;
        case 2: cout << "Tuesday"; break;
        case 3: cout << "Wednesday"; break;
        case 4: cout << "Thursday"; break;
        case 5: cout << "Friday"; break;
        case 6: cout << "Saturday"; break;
        case 7: cout << "Sunday"; break;
        default: cout << "Invalid";
    }
    return 0;
}
5填空题
以下程序根据分数(0~100)输出等级:90~100为'A',80~89为'B',70~79为'C',60~69为'D',0~59为'E'。请补全switch语句中的空缺部分。

#include <iostream>
using namespace std;
int main() {
    int score;
    cin >> score;
    int grade = score / 10;
    switch(grade) {
        case 10:
        ___ : cout << 'A'; break;
        case 8: cout << 'B'; break;
        case 7: cout << 'C'; break;
        case 6: cout << 'D'; break;
        ___ : cout << 'E';
    }
    return 0;
}