多分支问题的C程序设计
看完你能用 switch 写出分支清晰、无 fall-through 隐患的多路判断代码
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
多分支问题的C程序设计
看完你能用 switch 写出分支清晰、无 fall-through 隐患的多路判断代码
生活类比:自动售货机按键
在售货机前,你按 B3 键,掉下来的就是 B3 货架那瓶饮料——不会是别的。按键直接选中路由,这正是多分支的核心:一次判断,多条出路各走各的。
按下的键码对应 switch 表达式的值,对应货架对应 case 分支
if-else 链 vs switch
同样是多分支,有人层层问下去,有人直接按号入座——混淆点在于:二者到底差在“怎么找到那个分支”。
- 从上往下逐个条件判断
- 条件可以是区间、组合表达式
- 命中即停,前面全白问
- 按整型值直接跳到对应分支
- case 必须是常量整值
- 一步直达,不逐个试探
switch 表达式是什么
上一页我们看到 if-else 链像一路问下去的关卡,而 switch 更像直接「对号入座」。对号的前提,是括号里那个表达式必须先算出一个确定的值,拿这个值去和各个 case 比对。
取号机打出的号码对应表达式求值,被叫到的窗口对应匹配的 case
case 常量与匹配规则
上一页我们弄清了 switch 括号里的表达式,接着往下一行就是 case 标签。它像售货机按键上印的编号:编号必须是固定印好的数字,饮料掉不出来时你不会去按一个空白位置。
按键印死的编号对应 case 常量,投币金额对应表达式的值
执行路径:直达匹配分支
从上到下读:表达式先求值,再逐个比对 case,命中后直达,无需逐层判断。
字符分档示例
输入一个等级字符,用 switch 输出对应档位,展示最基本写法。
switch 括号里是字符变量,case 后写 'A' 这样的字符常量逐一匹配,default 兜住非法输入,每档 break 防止贯穿到下一档。
问题拆解:运算符是钥匙
上一页我们把输入的两个数分了档,但你注意到没有——档位是「大于、小于」这种范围判断。可运算符不是范围,它是 +、-、*、/ 四个独立的字符,这时候就该让字符本身当钥匙去开锁。
按下的按键字符对应 case 标签,按哪个掉哪格饮料
计算器的执行步骤
计算器程序从输入到输出,四步走完一次求值。
完整代码演示
完整的 switch 版四则运算计算器:输入两个数和一个运算符,直达对应分支算出结果。
switch(op) 拿钥匙,case 字符常量是齿口;break 对应“按一个键只出一罐”;default 接住非法输入,除法分支单独处理除零边界。
自测:case 匹配判分
有代码:int x=2; switch(x){ case 1: printf("A"); case 2: printf("B"); case 3: printf("C"); break; default: printf("D"); } 输出是什么?
default:没有钥匙时走哪
前几页我们让计算器认识 +、- 这些钥匙,能直达对应分支。可如果用户手滑输了个 @ 呢?钥匙串上一把都对不上,售货机会闪烁「无效按键」,程序里也需要一个兜底的出口。
无效按键触发提示音,对应所有 case 不匹配时进入 default
break 与贯穿执行
上一页的 default 解决了「没钥匙」的情况。但还有个隐藏规则:进门之后,如果身后没有关门,后面的门会一路被推开。这就是省略 break 后的贯穿执行。
进门后没关门,就会顺着走廊把后面的房门一路推开
几类说明小结
前面我们把 switch 从按键匹配一路讲到 break 的贯穿。翻教材会发现零散写了好多「注意事项」——这页把它们归拢:表达式能用什么类型、case 常量有什么硬规矩,一条条过。
按键编号固定唯一对应 case 常量唯一,投币口只收整数对应类型限制
要点收束
- ✓switch 按整型表达式的值直达匹配分支,比 if-else 链更直观
- ✓case 必须是编译期常量,匹配靠值相等而非范围
- ✓break 决定是否继续贯穿,漏写是最常见 bug
- ✓default 处理所有未列出的输入,别忘了边界
- ✓先拆解输入集合,再决定用 switch 还是 if-else
课后思考
先自己想几分钟,再对照参考答案;想不全也没关系,值得多琢磨。
参考答案会从匹配的 case 一路贯穿到底,把后面所有分支都执行一遍再落回 default。依据是「break 与贯穿执行」一页:case 只决定入口,break 才决定出口。
参考答案switch 只能匹配离散常量,连续区间不直接适用。可以用整数除法把分数折成离散档(如 score/15),先归一化再进 switch——拆解思路见「运算符是钥匙」一页。
参考答案两种路径:多写一组 case,或先用 tolower 归一化再进 switch。想想哪种分支更少、更好维护?这对应「计算器的执行步骤」里的预处理思想。