c 语言 switch 语句是 c 语言流程控制里面的多分支选择语句,核心是对括号内表达式求值,再和各个 case 后面的常量做等值匹配,匹配成功就进入对应分支执行代码,全部 case 都不匹配时,如果写了 default 就执行 default 兜底代码,switch 语句底层本质是跳转结构,适合离散固定数值的分支场景,比如菜单选项 状态码 按键编码处理,它和 if else if 最大差别就是 switch 语句只支持等值判断,不能直接写大于小于这类区间条件,最容易出错的点就是 break,缺少 break 会出现 case 穿透,也就是执行完当前分支继续向下运行后面所有 case 代码,很多新手一开始分不清主动穿透和误漏 break,把正常业务共用代码和 bug 混在一起,另外 switch 表达式只允许整型字符型枚举类型,不能使用 float double 浮点数,case 后面也必须是编译期常量,不能写变量,这些都是语法硬性限制。之所以选择 switch 语句,是当分支数量比较多,并且都是固定数值匹配的时候,相比一长串 if else if,代码层次更清晰,编译器还经常优化成跳转表,执行效率比逐个判断 if 条件更高。实际使用第一步定义待判断变量,优先选用 int char 或者 enum 枚举,第二步写 switch 关键字加小括号,内部放入待判断表达式,第三步大括号内部书写 case 常量加冒号,第四步每个分支按需编写业务代码,按需添加 break,第五步根据需要增加 default 兜底分支,第六步编译运行,逐个测试每一个 case 取值,确认是否出现意外穿透,第七步如果多个 case 共用同一段逻辑,可以主动省略前面 case 的 break 实现合并处理,最后确认语法合规,不使用浮点表达式和变量 case。
一 基础语法格式
switch (表达式)
{
case 常量 1:
分支代码
break;
case 常量 2:
分支代码
break;
default:
兜底代码
break;
}
语法硬性规则
1 switch 表达式结果必须是整型字符型枚举类型,浮点类型不允许
2 case 后面必须是常量表达式,不能是变量,也不能写区间
3 同一个 switch 内部 case 常量值不能重复,重复会编译报错
4 break 作用是跳出当前 switch,不会跳出外层循环
5 default 是可选分支,位置可以任意摆放,常规习惯写在末尾
二 完整代码示例
include
int main()
{
int opt;
scanf("%d", &opt);
switch(opt)
{
case 1:
printf("打开文件\n");
break;
case 2:
printf("保存文件\n");
break;
case 3:
printf("退出程序\n");
break;
default:
printf("无效选项\n");
break;
}
return 0;
}
三 case 穿透特性
case 穿透就是分支没有写 break 的时候,匹配当前 case 之后,程序继续向下执行后续 case 代码,这个特性可以主动利用,多个 case 共用同一段处理代码,示例写法
case 1:
case 2:
case 3:
printf ("统一处理逻辑 \n");
break;
这种属于合法写法,如果不是刻意合并代码,忘记写 break 就属于逻辑 bug,编写代码的时候要区分两种情况。
四 switch 语句和 if else if 对比表
| 对比项目 | c 语言 switch 语句 | if else if |
|---|---|---|
| 判断方式 | 等值匹配 | 等值区间复合逻辑都支持 |
| 支持类型 | 整型字符枚举 | 任意类型表达式 |
| 区间判断 | 不能直接写区间 | 原生支持区间判断 |
| 代码特点 | 离散多分支结构整洁 | 复杂逻辑更加灵活 |
| 执行优化 | 编译器可生成跳转表 | 从上到下逐个判断 |
五 高频易错要点
1 case 后面写变量,编译报错,case 必须是常量
2 switch 表达式使用浮点数,编译报错
3 漏写 break,发生意外穿透,业务逻辑错乱
4 同一个 switch 里面 case 常量重复,编译报错
5 嵌套 switch 时,break 只跳出当前层 switch,不会跳出外层 switch
6 误以为 default 必须写,default 可以省略,但是正式项目一般保留,捕获未知输入
【常见问题】
问题 1 c 语言 switch 语句为什么会连续执行多个 case
回答 1 c 语言 switch 语句连续执行多个 case,原因是分支内缺少 break,发生 case 穿透,匹配成功之后继续向下执行后续代码,使用 c 语言 switch 语句的时候,如果不需要合并逻辑,每个 case 末尾必须加上 break。
问题 2 c 语言 switch 语句能不能判断数字区间
回答 1 c 语言 switch 语句原生不支持直接写区间判断,c 语言 switch 语句只支持等值匹配,如果需要区间判断,优先使用 if else if,c 语言 switch 语句只能罗列大量 case 数值模拟,区间很大的时候不适合。
问题 3 c 语言 switch 语句里面 default 可以不写吗
回答 1 c 语言 switch 语句里面 default 属于可选分支,不是强制要求,c 语言 switch 语句如果所有取值都已经覆盖,没有未知情况,可以省略 default,但是正式项目一般保留 default 用来处理异常输入。
【免责申明】
本内容 c 语言 switch 语句讲解仅用于编程学习参考,不同编译器对边界写法警告等级存在差异,正式项目开发请遵循 ANSI C 标准以及项目编码规范,因漏写 break 或者错误使用穿透特性造成逻辑错误,使用者自行承担相关责任。


