第三章 · 选择结构程序设计知识点精讲

知识点2 if 语句嵌套

多层条件判断 —— else配对规则与执行流程

执行顺序 else配对规则 4道巩固练习
知识点2:if语句嵌套。讲解嵌套执行顺序、else配对规则,配套真题和4道巩固练习。
真题回顾

2021年真题 · 程序填空

真题回顾:二分查找

📝 前置学习 完成二分查找(折半查找)函数,在有序数组中查找指定元素。
2021真题 int binarySearch(int lib[], int bound, int value){ int lowKey=0,highKey=0,midKey=0,midValue=0; highKey=bound-1; while(lowKey<=highKey){ midKey=(lowKey+highKey)/2; midValue=lib[midKey]; if(midValue<value) lowKey=midKey+1; else if(midValue>value) highKey=midKey-1; else return midKey; } return -1; }
main函数 int main(){ int i=0,value=0,result=0; int lib[10]={-20,-5,8,11,26, 31,42,55,64,79}; for(i=0;i<10;i++) printf("%d\t",lib[i]); printf("\n输入要查找的数:"); scanf("%d", &value); result=binarySearch(lib,10,value); if(-1==result) printf("查找失败\n"); else printf("查找成功 index=%d\n",result); return 0; }
2021年真题:二分查找填空题。5个空:①int lib[] ②bound-1 ③(lowKey+highKey)/2 ④return -1 ⑤&value。
真题解析

答案解析 · 二分查找

真题解析:填空答案

int lib[]

函数参数:传入待查找的整型数组

bound-1

highKey初始化为数组最后元素下标

(lowKey+highKey)/2

计算中间元素下标

return -1

未找到时返回-1表示查找失败

&value

scanf传入value的地址

💡 算法原理

二分查找要求数组有序,每次比较中间元素,缩小一半搜索范围

📌 考点总结
本题综合考查了数组参数传递if-else if-else多分支判断scanf地址运算函数返回值等知识点。
解析5个填空答案,总结考点:数组参数、if-else if-else、scanf、函数返回值。
知识点分析

if 语句嵌套 · 核心规则

知识点分析

1

执行顺序

嵌套的if语句从外层到内层依次判断条件。外层条件为真,才执行内层if判断。

if(外层条件){ if(内层条件){ // 外真且内真 } }
2

嵌套层数

if语句可以多层嵌套,但层数过多会降低代码可读性。建议通过合理缩进保持清晰。

if(条件1) if(条件2) if(条件3) 语句;
3

else配对规则 ⚠️

每个else只与最近的前面的未配对if配对,与书写格式(缩进)无关!

if(a) if(b) 语句1; else // 与if(b)配对! 语句2;
🚨 悬空else问题(Dangling Else)
这是考试高频陷阱!else的配对与缩进无关,只与语法结构有关。建议使用花括号 {} 明确配对关系。
三个知识点:执行顺序(从外到内)、嵌套层数(可多层)、else配对规则(与最近if配对,与缩进无关)。
巩固提高

练习1 · 程序分析结果题

分析程序输出结果

📝 题目 下列程序的输出结果是________。
练习1 #include<stdio.h> int main(){ int a=5,b=0; if(a) if(a++>5) b++; else b--; printf("%d",b); getchar(); return 0; }

🔍 关键分析

if(a) → a=5,非零为,进入外层if

a++>5 → 先比较5>5为,后a变为6

else → 与最近的 if(a++>5) 配对

执行 b-- → b从0变为-1

✅ 答案
输出:-1
练习1:a=5非零为真进入外层if;a++先取值5,5>5为假,else与内层if配对执行b--,结果为-1。
巩固提高

练习2 · 程序填空

分段函数(符号函数)

📝 题目 输入x,输出对应y值(符号函数)。
y = 1 (x>0),   0 (x=0),   -1 (x<0)
练习2 #include "stdio.h" main() { int x,y; scanf("%d",&x); if(x>0) y=1; else if(x==0) y=0; else y=-1; printf("%d",y); }

填空①   x>0

if分支赋值y=1,对应x>0的情况。

填空②   y=-1

else分支处理x<0的情况,赋值y=-1。

💡 考点
if-else if-else多分支选择结构、分段函数实现
练习2:符号函数实现。填空①:x>0;填空②:y=-1。使用if-else if-else结构。
巩固提高

练习3 · 程序分析结果题

分析程序输出结果

📝 题目 下列程序的输出结果是________。
练习3 #include<stdio.h> int main(){ int a=123,b=324; if(a<b) if(a) b++; else a+=b; printf("%d %d",a,b); getchar(); return 0; }

🔍 逐步分析

步骤操作ab
初始123324
a<b → 123<324 123324
if(a) → 123≠0 123324
执行 b++123325
✅ 答案
输出:123 325
⚠️ else与最近的if(a)配对,而非if(a<b)。但因a非零,else分支不执行。
练习3:a=123<b=324为真,进入内层if(a),123非零为真执行b++,结果123 325。else与if(a)配对但不执行。
巩固提高

练习4 · 程序改错

三角形分类与面积计算(改错)

📝 题目 输入三边长,判定三角形类型(等边/等腰/直角/一般),有效三角形用海伦公式计算面积。找出两处错误。
原始代码(有错) L1 #include "stdio.h" L2 #include "math.h" L3 main() ← 错误1 L4 { float a,b,c; L5 float s,area; L6 printf("请输入三边的边长"); L7 scanf("%f,%f,%f",&a,&b,&c); L8 if(a+b<c||b+c<a||a+c<b) ← 错误2 printf("不能构成三角形"); else{ s=(a+b+c)/2; area=sqrt(s*(s-a)*(s-b)*(s-c)); if(a==b&&b==c) printf("等边三角形"); else if(a==b||b==c||a==c) printf("等腰三角形"); else if(a*a+b*b==c*c||...) printf("直角三角形"); else printf("一般三角形"); printf("面积=%f",area); }

❌ 错误1(L3行)

错误:main()
改正:int main()
C语言标准要求main函数需有明确返回类型int

❌ 错误2(L8行)

错误:if(a+b<c||...)
改正:if(a+b<=c||...)
两边之和等于第三边时也不能构成三角形,应使用 ≤

💡 考点
main函数返回类型、三角形不等式(≤而非<)、海伦公式、嵌套if-else if分类
练习4:错误1:main()应为int main();错误2:三角形判断条件应使用<=而非<。
重点提示

高频陷阱 · Dangling Else

悬空else问题详解

❌ 看似的配对(误导)

if(a) if(b) 语句1; else // 缩进暗示与if(a)配对 语句2;

⚠️ 缩进会误导你认为else与外层if(a)配对

✅ 实际的配对(正确)

if(a) { if(b) 语句1; else // 实际与if(b)配对! 语句2; }

✓ else总是与最近的未配对if配对,与缩进无关

🛡️ 解决方案
始终使用花括号 {} 明确if-else的配对关系。这不仅避免歧义,还能提高代码可读性,是良好的编程习惯。
悬空else问题:else与最近的未配对if配对,与缩进无关。解决方案:始终使用花括号。

知识点2 · 完

if 语句嵌套小结

嵌套if从外到内依次判断

else与最近的未配对if配对(高频考点)

使用花括号避免悬空else问题

a++先取值后自增,注意运算顺序

下一篇:知识点3 switch语句 →

小结if语句嵌套知识点,引导学生进入switch语句的学习。