📄 一句话概括
switch 是多分支的另一套写法:拿一个值去"对号入座"——跳到匹配的那个 case 执行,break 是每层的闸门,漏写就一路穿透到底。范围判断(>80)它干不了,离散点匹配(菜单选 1/2/3、按键响应)是它的主场。
一、语法与执行流程
char c;
cin >> c;
switch (c) {
case 'a':
cout << "苹果" << endl;
break; // 闸门:干完跳出 switch
case 'b':
cout << "香蕉" << endl;
break;
default: // 全都不匹配的兜底
cout << "未知" << endl;
}
执行顺序(对着图看):先算 switch 括号里的值 → 跳到值相等的那个 case(不是从上往下试!)→ 执行到 break 跳出整个 switch → 全不匹配走 default。
四个硬规矩:
- case 后必须是常量——
case 'a'、case 1行;case x(变量)、case score >= 60(范围)都不行。判范围是 if-else if 的活。 - break 别忘写——不写就"穿透"(fall-through):本层干完接着执行下一层代码,直到撞见 break 或开关结束。
- switch 括号里只能是整型、字符、枚举——
double、string都不行(浮点无精确匹配可言,字符串是对象)。 - default 位置随意,但惯例放最后;它也不需要 break(后面没层了)。
二、实例 05:根据输入的字符输出字符串
就是上面的代码:输入 a → "苹果";b → "香蕉";x → "未知"。
故意玩一次穿透:把 case 'a' 的 break 删掉,输入 a——输出"苹果"和"香蕉"两行。a 层干完没闸门,顺楼梯掉进了 b 层。这解释了为什么菜单程序里偶尔会见到故意不写 break 的写法:
case 'A':
case 'a': // 大小写共用一段代码:A 穿透到 a
cout << "苹果" << endl;
break;
三、30 秒实验:穿透现场
写一个没有 break 的三 case 开关,输入第一个值,数数输出几行。再把 break 逐个加回去,看输出一行行变少——break 的作用不用背,亲手关一次闸门就懂了。
四、常见误区
- "case 写范围
case 90..100"——不存在的。switch 只认离散常量点,范围判断回 4.2.3。 - "忘写 break 编译器会报错"——不报,是运行结果错(穿透)。最阴的一类 bug,靠测试每个分支才能抓到。有人给"故意穿透"写
// fall through注释,防止同事当成漏写。 - "switch 和 if-else if 谁更好"——看场景:离散点匹配用 switch(清晰、编译器还能优化成跳转表);范围判断、复杂逻辑条件(
&&||拼的)用 if 阶梯。各干各的活。
自测三问(点开对答案)
1. switch 括号里能放 double 吗?——不能,只收整型/字符/枚举。 2. 漏写 break 会怎样?——穿透:本 case 执行完继续执行下一 case 的代码,直到遇 break 或结束;编译不报错。 3. `case 'A': case 'a':` 连写是什么技巧?——利用穿透让两个标签共用同一段代码。- ☐ 4.5 判断语句的嵌套(下一节)
相关笔记
- 第三种形式的判断语句 —— 多分支的另一套写法,分工不同
- 关系运算符 —— 为什么 switch 判不了范围
- 🔷 C++基础 · 索引 —— 全课路线图