多分支问题的C程序设计

官官方信息技术老师·16 页·深入(追求细节与边界)·0 次浏览·38 天前
switch语句多分支case穿透C语言

多分支问题的C程序设计

看完你能用 switch 写出分支清晰、无 fall-through 隐患的多路判断代码

按 空格/→ 演示下一步

问一句
1 / 16 页

全部页面点击任意一页,跳回舞台从这页播放

switch语句多分支case穿透C语言

多分支问题的C程序设计

看完你能用 switch 写出分支清晰、无 fall-through 隐患的多路判断代码

1第 1 页 · 多分支问题的C程序设计

生活类比:自动售货机按键

在售货机前,你按 B3 键,掉下来的就是 B3 货架那瓶饮料——不会是别的。按键直接选中路由,这正是多分支的核心:一次判断,多条出路各走各的。

多分支结构
一个入口,按条件值分流到多个互斥分支之一
switch-case
C 语言的多分支语句,按表达式的值跳到匹配的 case
互斥选择
每次只执行一个分支,如同按键后只掉一瓶
default 兜底
所有 case 都不匹配时执行,像按了不存在的键
售货机按键对应 →switch-case

按下的键码对应 switch 表达式的值,对应货架对应 case 分支

2第 2 页 · 生活类比:自动售货机按键

if-else 链 vs switch

同样是多分支,有人层层问下去,有人直接按号入座——混淆点在于:二者到底差在“怎么找到那个分支”。

if-else 链
  • 从上往下逐个条件判断
  • 条件可以是区间、组合表达式
  • 命中即停,前面全白问
switch
  • 按整型值直接跳到对应分支
  • case 必须是常量整值
  • 一步直达,不逐个试探
条件是区间或复杂逻辑选 if-else 链;离散的整型取值(如菜单选项)选 switch。
3第 3 页 · if-else 链 vs switch

switch 表达式是什么

上一页我们看到 if-else 链像一路问下去的关卡,而 switch 更像直接「对号入座」。对号的前提,是括号里那个表达式必须先算出一个确定的值,拿这个值去和各个 case 比对。

只求值一次
switch(expr) 中 expr 先完整计算,得出一个结果
整型结果
结果必须是 int/char 等整数类型,float、double 不行
逐个比对
从上到下与 case 常量做「全等」比较,找相等的那一个
都不匹配
没有任何 case 相等时,跳到 default(若有)执行
取号排队叫号对应 →switch 匹配 case

取号机打出的号码对应表达式求值,被叫到的窗口对应匹配的 case

4第 4 页 · switch 表达式是什么

case 常量与匹配规则

上一页我们弄清了 switch 括号里的表达式,接着往下一行就是 case 标签。它像售货机按键上印的编号:编号必须是固定印好的数字,饮料掉不出来时你不会去按一个空白位置。

必须是常量
case 后只能是整型或字符型常量,不能是变量或实数
精确相等
表达式值与 case 常量相等才进入,用 == 比较
不可重复
两个 case 不能写相同的常量值,编译器会报错
售货机按键编号对应 →case 常量匹配

按键印死的编号对应 case 常量,投币金额对应表达式的值

5第 5 页 · case 常量与匹配规则

执行路径:直达匹配分支

从上到下读:表达式先求值,再逐个比对 case,命中后直达,无需逐层判断。

图解渲染中…
b1:比对即判断值是否严格相等,case 必须是整型常量e1:命中后从匹配点继续向下执行,除非遇到 break
6第 6 页 · 执行路径:直达匹配分支

字符分档示例

c

输入一个等级字符,用 switch 输出对应档位,展示最基本写法。

代码高亮加载中…

switch 括号里是字符变量,case 后写 'A' 这样的字符常量逐一匹配,default 兜住非法输入,每档 break 防止贯穿到下一档。

7第 7 页 · 字符分档示例

问题拆解:运算符是钥匙

上一页我们把输入的两个数分了档,但你注意到没有——档位是「大于、小于」这种范围判断。可运算符不是范围,它是 +、-、*、/ 四个独立的字符,这时候就该让字符本身当钥匙去开锁。

运算符当匹配对象
把读入的 op 字符放进 switch(op),一个字符对应一条路
case 写字符常量
case '+': 注意是单引号,不能写成双引号的字符串
每档一个分支
加、减、乘、除各占一个 case,互不干扰
别忘了 default
输入 % 或空格等非法运算符时,default 兜底报错
售货机按键对应 →switch 运算符

按下的按键字符对应 case 标签,按哪个掉哪格饮料

8第 8 页 · 问题拆解:运算符是钥匙

计算器的执行步骤

计算器程序从输入到输出,四步走完一次求值。

1
读入输入
scanf 获取两个操作数和一个运算符字符,如 3 + 5
2
求表达式值
这一步先不做计算,只把 '3+5' 当作待处理的题目存好
3
匹配运算符
switch 拿 '+' 做 key,逐个 case 常量比对,命中 '+','-'等分支
4
计算并输出
在命中的分支里执行对应运算,printf 打印 3 + 5 = 8
9第 9 页 · 计算器的执行步骤

完整代码演示

c

完整的 switch 版四则运算计算器:输入两个数和一个运算符,直达对应分支算出结果。

代码高亮加载中…

switch(op) 拿钥匙,case 字符常量是齿口;break 对应“按一个键只出一罐”;default 接住非法输入,除法分支单独处理除零边界。

10第 10 页 · 完整代码演示

自测:case 匹配判分

点击作答

有代码:int x=2; switch(x){ case 1: printf("A"); case 2: printf("B"); case 3: printf("C"); break; default: printf("D"); } 输出是什么?

11第 11 页 · 自测:case 匹配判分

default:没有钥匙时走哪

前几页我们让计算器认识 +、- 这些钥匙,能直达对应分支。可如果用户手滑输了个 @ 呢?钥匙串上一把都对不上,售货机会闪烁「无效按键」,程序里也需要一个兜底的出口。

default 的角色
所有 case 都不匹配时才执行的兜底分支
可省略但别省
语法上可写可不写,省略会让非法输入静默通过
位置随意
可放 switch 末尾或中间,习惯写在最后
记得 break
default 若不在末尾,同样会继续穿透到后面的 case
售货机无效按键提示对应 →default 分支

无效按键触发提示音,对应所有 case 不匹配时进入 default

12第 12 页 · default:没有钥匙时走哪

break 与贯穿执行

上一页的 default 解决了「没钥匙」的情况。但还有个隐藏规则:进门之后,如果身后没有关门,后面的门会一路被推开。这就是省略 break 后的贯穿执行。

贯穿执行
匹配后从该 case 一路向下执行到底,不回头
break 是闸门
每个 break 只终止本层 switch,缺一个就多贯穿一段
故意省略
多个 case 共享同一段代码时,可连续排列省略 break
没关上的旅店房门对应 →省略 break

进门后没关门,就会顺着走廊把后面的房门一路推开

13第 13 页 · break 与贯穿执行

几类说明小结

前面我们把 switch 从按键匹配一路讲到 break 的贯穿。翻教材会发现零散写了好多「注意事项」——这页把它们归拢:表达式能用什么类型、case 常量有什么硬规矩,一条条过。

表达式类型限制
整型与字符型,浮点数无法做 switch 表达式
case 必须常量
只能是常量或常量表达式,不能放变量或区间
case 值互不重复
同一 switch 内常量必须唯一,否则编译报错
default 位置自由
可放任意位置,但不写 break 同样会贯穿
switch 可嵌套
分支内再写 switch,注意 break 归属哪一层
售货机按键规则对应 →switch 各项说明

按键编号固定唯一对应 case 常量唯一,投币口只收整数对应类型限制

14第 14 页 · 几类说明小结

要点收束

  • ✓switch 按整型表达式的值直达匹配分支,比 if-else 链更直观
  • ✓case 必须是编译期常量,匹配靠值相等而非范围
  • ✓break 决定是否继续贯穿,漏写是最常见 bug
  • ✓default 处理所有未列出的输入,别忘了边界
  • ✓先拆解输入集合,再决定用 switch 还是 if-else
延伸主题:while 与 for 循环结构函数封装:把计算器拆成模块枚举类型让 case 更可读
15第 15 页 · 要点收束

课后思考

先自己想几分钟,再对照参考答案;想不全也没关系,值得多琢磨。

1如果删掉字符分档示例里所有 break,程序会输出什么?为什么?

参考答案会从匹配的 case 一路贯穿到底,把后面所有分支都执行一遍再落回 default。依据是「break 与贯穿执行」一页:case 只决定入口,break 才决定出口。

2把字符分档改成分数段 60/75/90,还适合用 switch 吗?该怎么拆?

参考答案switch 只能匹配离散常量,连续区间不直接适用。可以用整数除法把分数折成离散档(如 score/15),先归一化再进 switch——拆解思路见「运算符是钥匙」一页。

3如果用户输入小写运算符(如 '+' 换成 'a'),代码该怎么扩展?

参考答案两种路径:多写一组 case,或先用 tolower 归一化再进 switch。想想哪种分支更少、更好维护?这对应「计算器的执行步骤」里的预处理思想。

16第 16 页 · 课后思考