嵌套判断:路径中的再选择
看完你能画出多层分支的完整流程图,并说清每层判断的职责边界
按 空格/→ 演示下一步
全部页面点击任意一页,跳回舞台从这页播放
嵌套判断:路径中的再选择
看完你能画出多层分支的完整流程图,并说清每层判断的职责边界
什么是 if 的嵌套
上一页说嵌套是「路径中的再选择」。想想真实场景:你先进了写字楼大门,这只是一次判断;进了大堂还得看门牌,找电梯上楼——进门是第一层判断,看门牌是进门之后才发生的第二层判断。
进门成功对应外层条件成立,看门牌对应内层 if
嵌套的执行路径
从上往下读:只有通过外层条件这道门,才会走到内层判断;通不过就绕道,内层根本不执行。
嵌套的语法与缩进
看一段真实可运行的嵌套 if:外层判断门票资格,内层判断折扣,缩进体现谁包含谁。
第 4 行是外层判断;第 6 行比它多缩进一层,说明内层 if 被「包」在外层成立之后才执行;第 10 行的 else 与第 4 行对齐,属于外层。
嵌套 if vs else-if 链
两种写法都像"多条件选择",但语义完全不同:一个是层层包含,一个是并列互斥。混用会写出错误逻辑。
- 分支之间是包含关系
- 外层不成立,内层不执行
- 用于前提出成立才有后续判断
- 分支之间是并列互斥关系
- 命中一个,其余全部跳过
- 用于同一变量的多种取值分类
小测:else 配对谁
阅读这段代码:if (a > 0) { if (b > 0) { print("A"); } else { print("B"); } } 当 a=-1、b=5 时输出什么?
悬空 else 问题
上一页的小测里,else 写在两层缩进之间——它属于谁?编译器不靠缩进,只按一条铁律配对:就近原则。于是悬空 else 的真实归属,常和眼睛看到的不一样。
else 像找人认领,只能牵起离自己最近、还没被牵走的那只手
用花括号消除歧义
同一逻辑加不加花括号,else 的配对对象完全不同——两段可运行代码直接对比。
a=1>0 且 b=2>0,两版都只打印 both;但 v1 的 else 挂在内层 if 上,v2 靠花括号把 else 明确挂到外层 if。
嵌套层次的结构图
从上往下读:每个菱形是一次判断,其下方的分支就是它的管辖范围,越深的条件管辖范围越小。
小测:判断输出结果
有代码:x=6; if(x>5){ if(x>10){ print("A") } else { print("B") } },运行输出什么?
问题拆解:怎样比才不遗漏
前面我们见过嵌套的写法和 else-if 链,但真正动手时先要回答一个问题:判断三个数谁最大,到底要比几次、每次比完走哪条路?先把「比什么、比几回」规划清楚,代码才不会写漏。
第一场胜者晋级,再和第三人争夺冠军,场次对应比较次数
排序的判断流程
三个数排序,拆成三次两两比较,每层嵌套定下一个位置。
排序代码实现
用嵌套 if 实现三个数的完整排序:每层比较后交换,保证 a≤b≤c。
高亮行展示「再选择」:b>c 成立触发交换后,还需嵌套 if 再检查 a、b——这正是路径中的再判断。
小测:边界输入
用 a、b、c 三个数找最大值,判断写成 if(a>b && a>c){max=a} else if(b>c){max=b} else {max=c}。当 a=b=5、c=3 时,结果是?
登录检查要查几道门
前一页我们用嵌套处理了排序的边界,现在换个场景:登录。系统不会只问一次密码——先看用户名存不存在,存在才验密码。每道门都过,才放行。
大门验身份对应验用户名,单元门验密码对应验密码
逐层校验的流程
登录检查像过两道门:先验用户名,再验密码,各给反馈。
登录检查代码实现
把三道门写进嵌套 if,看错误提示如何一层层过滤出具体原因。
嵌套版中每道门都是「通过才进内层」,失败立刻给出对应提示——错误的分层正来自判断的分层。
顺序不同,提示不同
同样查两道门,先查密码还是先查用户名?顺序不同,报错信息和判断逻辑都会不一样。
- 先确认身份,再验密码
- 密码错时提示"密码不正确"
- 用户名不存在时不泄露密码检查逻辑
- 先验密码,再确认身份
- 用户名错时提示"用户不存在"
- 可能向攻击者暴露哪些账号存在
要点收束
- ✓if 进 else:先猜配对,再看缩进,花括号是铁证
- ✓嵌套 vs else-if:前者的分支里还能再问,后者问完即止
- ✓比大小不遗漏:先定全序,两两比较,等号单独处理
- ✓逐层校验:每道门只拦一种错,先拦的先提示
课后思考
三个问题先自己想,再看参考答案——答案只是起点。
参考答案先看缩进层级定结构,再由内层 else 向上找最近未配对的 if。可试着把登录检查代码口头「翻译」成流程图验证。
参考答案顺序决定提示的先后:靠前的判断先拦截,提示它对应的问题。各分支互不影响结果时顺序才无所谓,可回看「顺序不同,提示不同」一页对照。
参考答案取每个边界的两侧值加等于值,如 x==10 时试 9、10、11,再试极端值。目标是让每个分支至少被踩中一次。