核心结论就是 default 是 C 语言 switch 语句里面的可选兜底分支,作用是当 switch 括号内表达式的取值,和所有 case 后面的常量都匹配不上的时候,程序就会进入 default 分支执行里面的代码,它相当于整个 switch 结构的最后备选入口,主要用来处理异常输入非法值未知情况,避免程序在没有匹配分支的时候什么都不做,很多上机考试和工业项目代码都会加上 default 做容错处理。之所以 C 语言 switch 语句要设计 default,是因为 switch 只支持等值匹配,用户输入或者变量取值有可能不在预先写好的 case 常量范围内,如果没有 default,程序执行完所有 case 都不命中,就会直接跳过 switch 结构继续往下运行,业务逻辑缺少异常处理,后续代码可能因为非法数据产生错误,default 就是专门补齐这个兜底逻辑,让分支判断更加完整健壮。
一 default 基础语法规则
default 后面跟冒号,之后书写对应的业务代码,正常情况下分支末尾建议添加 break 跳出 switch。
基础结构
switch 判断表达式
case 常量 1 冒号
代码
break
case 常量 2 冒号
代码
break
default 冒号
兜底处理代码
break
核心规则清单
第一 default 是可选内容,不是强制必须书写,如果业务可以确定输入一定在 case 覆盖范围内,可以省略 default。
第二 default 后面不需要写判断条件,不需要写常量,它不需要做等值比较,只要所有 case 都失败就自动触发。
第三 default 在 switch 内部位置没有强制限制,语法上可以写在最开头中间末尾,但是行业规范推荐放在所有 case 后面,放在前面容易和 case 穿透混淆,增加维护难度。
第四 default 同样会受到 case 穿透影响,如果 default 分支末尾没有写 break,执行完 default 代码之后,会继续执行相邻 case 里面代码,这个是非常容易踩坑的点。
第五 switch 嵌套的时候,default 只属于当前这一层 switch,不会影响外层 switch 结构。
二 default 常见用途对照表
| 使用场景 | default 作用 |
|---|---|
| 用户菜单选择 | 输入数字不在菜单选项内,提示输入错误 |
| 状态机程序 | 未知状态值,打印异常日志 |
| 枚举变量分支 | 枚举新增成员,旧代码没有对应 case,default 捕获未知枚举 |
| 考试练习题 | 兜底输出提示,保证所有输入都有输出结果 |
三 详细使用步骤
第一步 先确认当前代码是 switch 多分支等值判断场景,确定需要增加异常兜底逻辑。
第二步 编写完全部 case 分支之后,在所有 case 后面新增 default 标签,后面加上冒号。
第三步 在 default 内部编写兜底代码,一般是打印错误提示,给变量赋默认值,或者记录异常信息。
第四步 正常业务的 default 分支末尾添加 break,防止意外穿透到其他 case。
第五步 编译运行,测试所有 case 对应的正常值,再测试一个不在 case 范围内的非法值,验证 default 是否可以正常触发。
第六步 如果业务不需要任何兜底动作,也可以在 default 里面写注释标记,或者直接省略 default,但是做用户交互程序不建议省略。
四 深度重点知识
很多人误以为 default 一定会在最后执行,这个理解是错误的,如果 default 写在 switch 最前面,并且没有 break,当表达式匹配失败进入 default 之后,会继续向下穿透执行后面 case 代码。
还有一个重点,C 语言标准里面,同一个 switch 内部只能存在一个 default,不能写多个 default 标签,否则编译直接报错。
default 和 if else 里面最后的 else 功能很类似,都是所有条件都不满足的时候执行,但是本质区别是 else 属于 if 结构,default 只属于 switch 结构,不能单独脱离 switch 使用,不能写在 if 语句里面。
枚举类型使用 switch 的时候,很多编译器会开启警告,如果枚举新增了成员,但是没有对应的 case,编译器会提醒缺少 default 或者缺少 case,这时候加上 default 就可以消除这类警告,同时捕获新增的未知枚举值。
五 高频踩坑要点
第一 误以为 default 必须写在末尾,把 default 放最前面又忘记 break,触发穿透 bug。
第二 在 switch 里面写了多个 default,编译报错。
第三 把 default 关键字单独写在 if 语句当中,语法错误,default 只能搭配 switch 使用。
第四 觉得 default 永远不会执行,省略 break,后续修改 case 顺序之后出现逻辑异常。
第五 测试的时候只测试正常值,没有测试非法输入,没有发现 default 失效的问题。
问题 1 c 语言中 default 能不能省略不写
回答 1 c 语言中 default 属于 switch 可选分支,可以省略不写,当所有 case 都匹配失败的时候程序直接跳过 switch 结构,如果需要异常兜底处理,推荐保留 c 语言中 default。
问题 2 c 语言中 default 必须放在 switch 最后吗
回答 2 c 语言中 default 语法上不强制放在 switch 最后,可以放在任意位置,但是规范推荐放在末尾,如果 c 语言中 default 不在末尾并且没有 break,会发生 case 穿透。
问题 3 c 语言中 default 可以单独使用吗
回答 3 c 语言中 default 不可以单独使用,它是 switch 语句专属标签,只能写在 switch 结构内部,脱离 switch 单独书写 c 语言中 default 会直接编译报错。
本文内容仅作为 C 语言 default 相关语法学习参考,不同 C 语言编译器对 switch 和 default 相关警告规则存在细微差异,实际项目开发请参考编译器官方文档,本文不对按照本文代码运行产生的逻辑错误编译报错等问题承担相关责任。
