c 语言中 switch 是多分支选择语句,专门用来根据一个整型或者字符类型表达式的值,匹配对应的 case 分支执行代码,和 if 多分支相比,分支数量多的时候结构更加清晰,核心特点是匹配成功之后会从对应的 case 入口开始向下执行,如果没有写 break,代码会继续穿透执行后面所有 case,这个穿透特性是新手最容易出错的地方,switch 括号里面的表达式只能是整型字符型枚举类型,不能是浮点数字符串,每个 case 后面必须跟常量表达式,不能写变量作为判断条件,末尾可以搭配 default 分支,当所有 case 都匹配不上的时候,就会执行 default 里面的代码,菜单选择成绩等级计算器选项这类固定取值多分支场景,使用 switch 会比一长串 if else 可读性更好。
之所以设计 switch,是因为当判断条件是同一个变量的多种固定取值时,连续写很多 if else 会显得冗长,switch 采用跳转匹配的思路,编译器底层一般会优化成跳转表,分支数量多的时候执行效率会优于普通 if else 链,但是它限制条件必须是离散常量,不能写区间判断,比如大于 60 小于 80 这种范围判断,就不适合 switch,还是要使用 if 语句,理解这点就能分清 switch 和 if 的适用场景。
基础语法结构
switch 括号内放待判断表达式,表达式结果必须是整型相关类型。
case 后面写常量值,后面加冒号,匹配成功就进入这个分支。
break 语句作用是跳出 switch 结构,防止继续穿透执行后面分支。
default 是可选分支,所有 case 都不匹配时执行,位置可以写在任意位置,一般习惯放在最后。
执行流程
第一步计算 switch 括号里面表达式的值。
第二步依次和各个 case 后面常量做匹配。
第三步匹配成功,从该 case 开始执行内部代码。
第四步如果遇到 break,立刻跳出整个 switch 结构,后续分支不再执行。
第五步如果没有 break,就继续向下执行后面 case 代码,也就是穿透现象。
第六步所有 case 都匹配失败,执行 default 分支里面代码。
关键限制与要点
case 后面只能是常量,不能使用变量或者表达式区间,比如 case 60 到 80 这种写法非法。
switch 表达式不能是 float double 浮点数,也不能是字符串。
多个 case 可以共用同一段代码,也就是 case 穿透的合理用法,多个 case 连续写,只在最后写代码和 break。
case 常量值不能重复,同一个 switch 里面不能出现两个相同数值的 case,编译会报错。
对比表格
| 语句类型 | 判断形式 | 是否支持区间 | 适合场景 |
|---|---|---|---|
| switch | 单个变量匹配固定常量 | 不支持 | 菜单选项等级选择 |
| if else | 条件表达式 | 支持区间 | 范围判断复杂逻辑 |
高频易错要点
忘记写 break 造成意外穿透,本来只想执行当前分支,结果后面分支代码全部运行,这是最常见 bug。
把 default 当成必须写的分支,其实 default 可以省略,没有 default 并且全部 case 不匹配,switch 内部代码一行都不会执行。
case 后面写变量,编译直接报错,case 要求编译期就确定的常量。
switch 里面可以嵌套 if,也可以多层 switch 嵌套,但是嵌套层级不要太深,避免代码可读性下降。
c 语言中 switch 用法核心就是整型表达式匹配 case 常量,重点掌握 break 控制跳出,理解 case 穿透机制,记住它只能匹配离散常量,不能做区间判断,菜单选择这类多分支场景合理使用,可以让代码更加规整易读。
【常见问题】
问题 1 c 语言中 switch 用法里面 break 可以省略吗
回答 1 c 语言中 switch 用法里面 break 可以省略,省略之后会发生 case 穿透,继续执行后面分支代码,合理穿透可以让多个 case 共用代码。
问题 2 c 语言中 switch 用法可以判断浮点数吗
回答 2 c 语言中 switch 用法括号表达式只支持整型字符型枚举类型,不能使用浮点数做判断,浮点区间判断需要改用 if 语句。
问题 3 c 语言中 switch 用法 default 是必须写的吗
回答 3 c 语言中 switch 用法 default 属于可选分支,不是强制要求,如果所有 case 都不匹配,又没有 default,switch 内部代码不会执行。
问题 4 c 语言中 switch 用法 case 后面可以写变量吗
回答 4 c 语言中 switch 用法 case 后面必须是常量表达式,不能写变量,变量作为判断条件属于语法错误,无法正常编译。
【免责申明】
本文内容仅用于 c 语言学习参考,不同编译器对 switch 相关语法细节处理存在差异,请结合编译环境测试验证,相关内容不构成绝对标准承诺,相关风险由使用者自行承担。


