在 if 语句的代码块内部,可以再包含另一个 if 语句(或 if-else 语句),这种结构称为嵌套 if 语句。它用于处理多层条件判断的场景。
1. 生活逻辑与代码映射
场景描述:
- 如果天气很好 → 到院子去
- 如果天气很冷 → 坐在太阳下
- 否则 → 坐在树荫下
- 否则(天气不好) → 待在屋内,喝柠檬水
对应代码结构:
if(天气很好)
{
到院子去;
if(天气很冷)
坐在太阳下;
else
坐在树荫下;
}
else
待在屋内,喝柠檬水;Code language: JavaScript (javascript)
2. 语法结构
if(表达式1)
{
语句A;
if(表达式2)
语句B;
else
语句C;
}
else
语句D;
其它语句 E;Code language: JavaScript (javascript)
执行流程:
- 先判断
表达式1 - 若为真 → 执行
语句A,再判断表达式2:- 若为真 → 执行
语句B - 若为假 → 执行
语句C
- 若为真 → 执行
- 若为假 → 执行
语句D - 无论走哪条路径,最终都执行
其它语句 E
流程图解析(图 3-3 映射):
| 步骤 | 判断/操作 | 走向 |
|---|---|---|
| ① | 判断 Expression1 == True? | 真→②,假→④ |
| ② | 执行 Statement A | 向下 |
| ③ | 判断 Expression2 == True? | 真→执行 Statement B→⑤,假→执行 Statement C→⑤ |
| ④ | 执行 Statement D | 向下 |
| ⑤ | 执行 Next Statement(其它语句 E) | 结束 |
3. 综合练习:分析数字的奇偶性与半数奇偶性
需求:输入一个整数,判断是偶数还是奇数;若为偶数,再判断该数的一半是否仍为偶数。
#include <stdio.h>
#include <limits.h> /* 提供 LONG_MAX */
int main(void)
{
long test = 0L; /* 保存要测试的整数 */
printf("请输入一个小于%ld的整数:", LONG_MAX);
scanf(" %ld", &test);
/* 外层判断:测试奇数还是偶数 */
if(test % 2L == 0L)
{
printf("这个数 %ld 是偶数\n", test);
/* 内层嵌套判断:检查一半是否仍为偶数 */
if((test / 2L) % 2L == 0L)
{
printf("\n这个数 %ld 的一半仍然是偶数", test);
printf("\n这是不是很有趣?\n");
}
}
else
printf("这个数 %ld 是奇数\n", test);
return 0;
}Code language: PHP (php)
运行示例:
| 输入 | 外层判断 test % 2 | 内层判断 (test/2) % 2 | 输出结果 |
|---|---|---|---|
| 8 | 0(偶数) | (8/2)=4, 4%2=0(偶数) | “8是偶数” + “一半仍然是偶数” + “有趣” |
| 6 | 0(偶数) | (6/2)=3, 3%2=1(奇数) | “6是偶数”(无内层输出) |
| 7 | 1(奇数) | 不执行内层 | “7是奇数” |
经典陷阱示例:
// 歧义代码:else 到底属于哪个 if?
if(a > 0)
if(b > 0)
printf("a>0 and b>0");
else
printf("a <= 0");
// 实际配对:else 与内层 if 结合(最近原则)
// 修正:用大括号明确意图
if(a > 0)
{
if(b > 0)
printf("a>0 and b>0");
}
else
printf("a <= 0");Code language: JavaScript (javascript)
Previous: 在 if 语句中使用代码块
Next: 测试字符与大小写转换