第四章——选择结构 第六节——switch-break语句及其构成的选择结构
这篇文章最后更新于 some 天前,内容可能已经过时。
1. 什么是switch-break语句? switch-break是C语言中用于多分支选择 的控制结构,它通过匹配一个表达式的值,决定执行哪一段代码。
核心思想 :像“服务员根据顾客点的菜名做对应的菜”。
switch :服务员,根据输入的值(菜名)决定做什么。
case :菜单上的每一道菜(具体选项)。
break :做完这道菜就停下(否则会继续做后面的菜!)。
default :如果没点任何列出的菜,就默认做奶茶(兜底选项)。
2. 语法结构 1 2 3 4 5 6 7 8 9 10 11 12 switch (表达式) { case 值1 : 执行代码1 ; break ; case 值2 : 执行代码2 ; break ; ... default : 默认执行代码; break ; }
表达式 :必须是整型或字符型 (如int、char)。
case :每个值必须是固定常量 (不能是变量)。
break :跳出switch,否则会继续执行后续case(穿透效应)。
default :可选的默认分支,处理所有未匹配的情况。
3. default的作用
兜底选项 :当所有case都不匹配时执行default。
场景举例 :
用户点了菜单上没有的菜 → 推荐默认菜品(奶茶)。
程序接收到未知状态码 → 提示“请检查输入”。
4. 生活中的例子 例1:点餐系统 1 2 3 4 5 6 7 int choice = 2 ; switch (choice) { case 1 : printf ("牛肉面已下单!\n" ); break ; case 2 : printf ("炒饭已下单!\n" ); break ; case 3 : printf ("奶茶已下单!\n" ); break ; default : printf ("抱歉,暂时没有这道菜。\n" ); }
输出 :炒饭已下单!
如果用户输入4 :抱歉,暂时没有这道菜。(default生效)
例2:交通信号灯 1 2 3 4 5 6 7 int light = 2 ; switch (light) { case 1 : printf ("红灯:请停车!\n" ); break ; case 2 : printf ("黄灯:准备通行!\n" ); break ; case 3 : printf ("绿灯:可以通行!\n" ); break ; default : printf ("信号灯故障,请小心!\n" ); }
如果light=4 :输出信号灯故障,请小心!(default兜底)
5. switch和if-else的区别
场景
switch
if-else
适用类型
整型、字符型
所有类型(包括浮点、字符串)
多分支效率
更高效(直接跳转)
逐个判断条件
穿透效应
存在(需注意break)
无
默认处理
default兜底未匹配情况
else处理未匹配情况
6. 常见错误与避坑指南 坑1:忘记加break导致“穿透效应” 1 2 3 4 5 switch (choice) { case 1 : printf ("牛肉面\n" ); case 2 : printf ("炒饭\n" ); default : printf ("奶茶\n" ); }
如果choice=1 ,输出:
原因 :没有break,程序会继续执行后续case,直到遇到break或结束。
避坑方法 :每个case后都加break,除非有意设计穿透(如合并选项)。
坑2:default的位置影响执行流程 1 2 3 4 5 switch (x) { case 1 : printf ("1\n" ); break ; default : printf ("default\n" ); case 2 : printf ("2\n" ); break ; }
如果x=2 ,程序会先执行default,再执行case 2,因为default不在最后。
避坑方法 :把default放在最后,避免逻辑混乱。
坑3:switch表达式类型错误 1 2 float x = 3.14 ;switch (x) { ... }
原因 :switch的表达式必须是整数 或字符 ,不能是浮点数或字符串。
坑4:case后使用非常量 1 2 3 4 int a = 5 ;switch (x) { case a: ... }
原因 :case后面必须是固定值 (如1、2、’A’),不能是变量。
7. default的典型应用场景
无效输入处理
错误处理
默认操作
8. 总结
switch-break的核心 :根据表达式的值快速匹配多个分支,default作为兜底。
关键规则 :
表达式必须是整型或字符 。
每个case必须是固定值 。
每个case后尽量加break ,除非有意设计穿透。
default放最后,处理未匹配的情况。
记住一句话 :
switch是“菜单选择器”,default是“最后的救命稻草”!
9.几点稍微正式一点的说明
switch、case 和 default 是 C 语言关键字,default 子句可缺省; 2. switch 后的表达式必须为整型或字符型(如 int、char); 3. case 后的常量表达式称为标号,标号必须互不相同,且 case 与标号间需留空格(如 case 1:); 4. case 标号后的语句序列可以为空(仅保留冒号),但冒号不可省略; 5. case 后的语句序列可以是单条或多条语句,多条语句无需用 {} 包裹; 6. 多个 case 可共用同一组执行语句(实现多个标号对应相同操作),如下实例,无论输入大写还是小写,都是一样的;
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 #include <stdio.h> int main () { int grade; printf ("请输入成绩等级 (A/B/C/D): " ); scanf ("%c" , &grade); switch (grade) { case 'A' : case 'a' : printf ("优秀\n" ); break ; case 'B' : case 'b' : printf ("良好\n" ); break ; case 'C' : case 'c' : printf ("中等\n" ); break ; case 'D' : case 'd' : printf ("及格\n" ); break ; default : printf ("无效输入\n" ); } return 0 ; }
7. 若未使用 break,程序会顺序执行后续所有 case 语句(包括 default),因此必须用 break 跳出当前 case; 8. switch 语句支持嵌套,内部 switch 的规则与外部一致; 9. case 标号必须为常量表达式(如字面量、宏定义等),不能是变量或计算结果; 10. default 子句通常放在最后,用于处理未匹配的情况; 11. 避免因忘记 break 导致的穿透执行(fall-through)问题。