C++ switch 语句基础
中等60用 switch 语句做“多路选择”——就像电梯按钮和遥控器
你有没有用过遥控器?按数字键 1 看新闻,按 2 看动画片,按 3 看电影。或者坐电梯时,按几楼电梯就去几楼。C++ 里也有一款专门做这种“根据一个值跳到不同位置”的工具,叫作 switch 语句。它根据一个整数(或字符)的值,直接跳到对应的分支去执行代码,比用一堆 if-else 更清晰、更方便。
switch 的语法长什么样?
switch (变量) {
case 值1:
// 当变量 == 值1 时执行的代码
break;
case 值2:
// 当变量 == 值2 时执行的代码
break;
// 可以有很多 case
default:
// 当变量不匹配任何 case 时执行的代码
break;
}
几个重要的要求:
- 变量必须是整数类型,比如
int、char(字符也是整数),不能是小数或字符串。 - 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 写一堆条件判断要清爽得多。
新手最容易犯的三个错误
-
忘记写 break 导致意外穿透
比如写了一个星期几的程序,每个 case 后面忘了break,那么输入 1 会输出“周一”“周二”……直到遇到 break 为止。结果乱成一锅粥。
✅ 每个 case 最后务必习惯性加上break(除非你故意利用穿透)。 -
case 后面的值重复
switch (score) { case 90: cout << "优秀"; break; case 90: cout << "你咋又来了"; break; // 错误!同一个值不能出现两次 }编译器会报错。每个 case 的值必须是唯一的。
-
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 放在
while或for里面,做成多次选单。 - break 语句:不只在 switch 里用,在循环里也能用,表示提前结束循环。
- 枚举类型:未来你会学到
enum,可以用有含义的名字代替数字,让 switch 更易读。
switch 语句就像班级里老师按学号点名:喊到什么号,对应的人就起立。代码也是,根据不同的值“跳”到不同的位置去执行任务。掌握它,你的程序就更像一个精准的“自动导航仪”了!
例题精讲
在C++中,switch语句后面的表达式必须是以下哪种类型?
如果switch语句中某个case后面没有break,程序会继续执行后续case的代码,直到遇到break或switch语句结束。
以下代码根据星期数(1~7)输出英文名称,但缺失了关键部分。请在___处填写正确的语句。
int day = 3;
switch(day) {
case 1: cout << "Monday"; ___;
case 2: cout << "Tuesday"; break;
case 3: cout << "Wednesday"; break;
default: cout << "Other";
}以下关于switch语句中default分支的说法,正确的是?
以下代码根据成绩等级输出评语,请补全case标签部分。
char grade = 'B';
switch(grade) {
___ cout << "良好"; break;
case 'A': cout << "优秀"; break;
default: cout << "继续努力";
}