C++ switch 语句
困难19C++ switch 语句:多路选择的“菜单”与“转盘”
当我们写程序时,常常要根据一个变量的不同取值,去执行不同的操作。比如:
- 根据考试分数,输出“优秀”、“良好”、“及格”或“不及格”。
- 根据输入的数字1~7,输出对应的星期英文名。
- 根据用户选择的菜单编号(1~4),进入不同的功能模块。
如果只有两三种情况,用 if-else 很方便。但如果要判断的情况很多(比如7种、12种),用一连串的 if-else if 就会变得又长又乱,就像在一条有很多岔路的路上,需要不停地问“是不是这个?是不是那个?”。C++ 为我们准备了一种更清晰、更高效的结构——switch 语句。
switch 语句就像一个大转盘,转盘上有许多小格子,每个格子上标着一个数字或字符。你拿一个令牌(一个表达式的值)往转盘上一放,指针就会“啪”地指向对应的格子,然后执行那个格子里的指令。如果令牌上的值没有匹配的格子,就会执行一个备用的“default”格子。
一、switch 语句的基本格式
switch (表达式) {
case 值1:
// 当表达式 == 值1时执行的代码
break;
case 值2:
// 当表达式 == 值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 1 到 case 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 吧!
例题精讲
在C++中,switch语句的表达式必须是什么类型?
在C++的switch语句中,break关键字的作用是什么?
在C++的switch语句中,每个case后面的表达式必须是常量表达式,且同一switch中不能出现重复的case常量。
以下程序根据输入的数字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;
}以下程序根据分数(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;
}