核心结论 c 语言 switch 是多分支选择语句,专门用来对一个整型或者枚举类型表达式做等值匹配,根据表达式的值,跳转到对应的 case 分支执行代码,它本质是多路分支跳转,和 if else 链式判断相比,当分支数量很多的时候,代码可读性更好,编译器还可能优化成跳转表提升执行效率。switch 括号里面的表达式只能是整型字符型枚举类型,不能直接使用浮点数字符串,因为 switch 是等值精确匹配,浮点数存在精度误差,字符串也不是整型值,这是最基础的限制。switch 最核心特点就是 case 穿透,如果某个 case 分支末尾没有写 break,代码会继续顺序执行后面所有 case 里面的语句,直到遇到 break 或者 switch 整体结束,这个穿透特性既是特性也是新手最容易踩的坑,很多 bug 就是忘记写 break 造成分支串执行。default 分支是可选分支,当所有 case 的值都匹配失败的时候,才会执行 default 里面的代码,default 位置不强制放在最后,可以写在任意位置,但是放在末尾是行业通用习惯。
基础书写步骤
1 写 switch 关键字,后面圆括号里面放待判断的表达式,表达式结果必须是整型相关类型
2 大括号内部编写多个 case 标签,case 后面跟常量整型值,后面加冒号
3 在每个 case 分支内部写对应的业务代码,分支末尾按需添加 break 终止当前分支
4 按需添加 default 分支,处理所有 case 都不匹配的情况
5 switch 整体执行完成之后,继续向下执行 switch 后面的代码
核心规则深度说明
清单
1 case 后面必须是编译期常量表达式,不能写变量,不能是动态变化的值
2 同一个 switch 内部,case 常量值不能重复,否则编译报错
3 字符常量可以直接写在 case 后面,因为 char 底层本质就是整型,比如 case A 是合法写法
4 break 作用是跳出当前 switch 结构,如果不需要跳出就可以省略,利用穿透实现多值共用一段代码
5 switch 里面可以嵌套循环,循环内部也可以写 break,这里 break 只会跳出循环,不会跳出外层 switch,这点容易混淆
6 可以在 case 分支里面定义局部变量,但是跨 case 跳转的时候要注意变量初始化问题,部分编译器会报警告
穿透特性合理用法
穿透不是全部都要避免,合理利用穿透可以合并多个等值条件共用同一段代码,比如值 1 值 2 值 3 都执行相同逻辑,就可以连续写 case 1 case 2 case 3,最后只写一份代码加 break,不用重复复制代码,这种写法是官方认可的规范用法。不合理穿透就是本来各个分支逻辑独立,遗漏 break,导致上一个分支代码执行完,意外继续执行下一个分支代码,业务逻辑错乱。
switch 和 if else 对比表格
| 项目 | switch | if else |
|---|---|---|
| 判断方式 | 等值匹配 | 支持大于小于等于区间判断 |
| 表达式类型 | 整型枚举字符 | 任意逻辑表达式 |
| 分支优化 | 编译器可生成跳转表 | 顺序逐个判断 |
| 适用场景 | 分支多 固定等值判断 | 区间判断 复杂逻辑判断 |
编码注意事项
第一 switch 表达式不能直接写 double 浮点数,如果确实需要浮点数分支判断,要转换成整型或者改用 if else 结构
第二 default 分支不是必须写,如果业务上已经保证所有情况都被 case 覆盖,可以省略 default,但是稳健编码一般建议保留 default 做异常兜底
第三 case 标签后面的常量不能是字符串,想要根据字符串选择分支,需要自己写 strcmp 比较,不能直接放到 switch 里面
第四 switch 内部也可以搭配 goto,但是一般不推荐,正常使用 break 就足够完成分支退出
第五 C99 之后允许 switch 内部 case 标签后面直接声明变量,但是跨 case 跳转如果跳过变量初始化,属于未定义行为,推荐在 case 内部加大括号隔离作用域
【常见问题】
问题 1 c 语言 switch 用法里面 case 后面能不能写变量
回答 1 c 语言 switch 用法里面 case 后面必须是编译期常量,不能写普通变量,变量的值运行时才确定,switch 编译阶段就要确定所有 case 标签,所以动态变量不能作为 case 的值。
问题 2 c 语言 switch 用法忘记写 break 会出现什么现象
回答 2 c 语言 switch 用法如果 case 末尾忘记写 break,就会发生 case 穿透,当前分支代码执行完成之后,继续执行后面所有 case 的代码,直到碰到 break 或者 switch 结束,造成多个分支逻辑混在一起。
问题 3 c 语言 switch 用法可以判断浮点数吗
回答 3 c 语言 switch 用法只支持整型字符枚举类型,不能直接判断浮点数,浮点数存在精度误差,无法可靠做等值匹配,浮点数分支一般改用 if else 实现。
问题 4 c 语言 switch 用法 default 分支必须放在最后吗
回答 4 c 语言 switch 用法 default 分支位置没有强制要求,可以写在 switch 内部任意位置,但是行业习惯把 default 放在末尾,作为所有 case 匹配失败之后的兜底处理。
【免责申明】
本文内容仅作为 c 语言 switch 用法相关知识学习参考,不同编译器对 case 跨变量初始化的警告标准存在差异,代码演示仅用于原理讲解,因遗漏 break 错误使用 case 常量等问题造成程序逻辑异常,由使用者自行承担。


