3.2.3 if语句的嵌套

前面所介绍的if语句允许用户选择是否执行某一操作,if···else语句允许用户在两个操作中选择某一执行。不过,在实际运用中可能存在两种以上的选择,把if···else语句稍加扩展就能满足要求。

if语句嵌套的一般形式:

if-else if-else结构
if (表达式1) 语句1; else if (表达式2) 语句2; else if (表达式3) 语句3; ... else 语句n;

使用这种形式可以有几种不同的选择,其执行过程如下图所示:

执行流程:表达式1 → True → 语句1 → 结束

表达式1 → False → 表达式2 → True → 语句2 → 结束

表达式2 → False → 表达式3 → True → 语句3 → 结束

表达式3 → False → ... → else → 语句n → 结束

实例分析

有一个函数:

\[y = \begin{cases} x & (x<1) \\ 2x-1 & (1 \leq x <10) \\ 3x-10 & (x \geq 10) \end{cases}\]

编写程序,输入 \(x\),输出 \(y\) 值。

例3-3:分段函数实现
#include <stdio.h> int main() { float x, y; printf("请输入x的值:"); scanf("%f", &x); if (x < 1) y = x; else if (x < 10) y = 2 * x - 1; else y = 3 * x - 10; printf("y=%.2f\n", y); return 0; }

执行过程:程序在3种情况下选择哪一种,取决于x的值。

  • 当x小于1时,选择第一种情况
  • 当x在1与10之间时,选择第二种情况
  • 当x大于或等于10时,选择第三种情况

if语句嵌套中else的配对规则

一条if语句中可以包含另一条if语句,称为if语句的嵌套。在嵌套的if语句中,else与其上最近的if配对,除非用花括号来改变。

else配对示例
// 例1: else与第2个if配对 if(x > 7) if(x < 13) printf("left!\n"); else printf("right!\n"); // 例2: else与第1个if配对(使用花括号改变配对关系) if(x > 7) { if(x < 13) printf("left!\n"); } else printf("right!\n");

配对规则总结:

  • else总是与它上面最近的if配对
  • 可以使用花括号{}来改变配对关系
  • 良好的代码缩进有助于理解配对关系,但编译器只遵循语法规则

练习题 - 基础概念

题目1:

下列关于if语句嵌套的说法中,正确的是()

A. else总是与同一层的if配对
B. else总是与最外层的if配对
C. else总是与上面最近的if配对
D. else可以与任意if配对

答案:C

解析:在C语言中,else总是与它上面最近的尚未配对的if语句配对,这是C语言的语法规则。

题目2:

以下代码的输出结果是()

int a = 5, b = 0; if (a > 3) if (a < 10) b = 1; else b = 2; printf("%d", b);
A. 0
B. 1
C. 2
D. 编译错误

答案:B

解析:else与上面最近的if配对,即if(a<10)。a=5大于3且小于10,所以执行b=1。

题目3:

以下代码中,else与哪个if配对?

if (a > b) if (b > c) printf("abc"); else printf("cba");
A. 与if(a>b)配对
B. 与if(b>c)配对
C. 与最近的printf配对
D. 编译错误

答案:B

解析:根据C语言的规则,else总是与上面最近的if配对,所以这里的else与if(b>c)配对。

练习题 - 程序分析

题目1:

以下代码段执行后,k的值是()

int i = 4, j = 5, k = 0; if (i > j) if (j > 0) k = 1; else k = 2;
A. 0
B. 1
C. 2
D. 无法确定

答案:A

解析:else与if(j>0)配对。i=4不大于j=5,所以不执行内层if语句,k保持原值0。

题目2:

以下程序运行后的输出结果是()

int x = 1, y = 2; if (x > 0) if (y > 1) printf("A"); else printf("B"); else printf("C");
A. A
B. B
C. C
D. 无输出

答案:A

解析:x=1>0为真,进入内层if,y=2>1为真,执行printf("A")。

题目3:

以下代码的输出是()

int a = 3, b = 4, c = 5; if (a > b) if (a > c) printf("A"); else printf("B"); else if (b > c) printf("C"); else printf("D");
A. A
B. B
C. C
D. D

答案:D

解析:a=3不大于b=4,执行第一个else。b=4不大于c=5,执行第二个else,输出"D"。

练习题 - 编程应用

题目1:

编写程序,输入一个字符,判断它是大写字母、小写字母、数字还是其他字符。

#include <stdio.h> int main() { char ch; printf("请输入一个字符: "); scanf("%c", &ch); if (ch >= 'A' && ch <= 'Z') printf("大写字母\n"); else if (ch >= 'a' && ch <= 'z') printf("小写字母\n"); else if (ch >= '0' && ch <= '9') printf("数字\n"); else printf("其他字符\n"); return 0; }

题目2:

编写程序,输入三个整数,找出并输出其中的最大值。

#include <stdio.h> int main() { int a, b, c, max; printf("请输入三个整数: "); scanf("%d%d%d", &a, &b, &c); if (a > b) { if (a > c) max = a; else max = c; } else { if (b > c) max = b; else max = c; } printf("最大值是: %d\n", max); return 0; }

题目3:

编写程序,根据学生成绩输出等级:90分以上为'A',80-89分为'B',70-79分为'C',60-69分为'D',60分以下为'E'。

#include <stdio.h> int main() { int score; printf("请输入成绩: "); scanf("%d", &score); if (score >= 90) printf("A\n"); else if (score >= 80) printf("B\n"); else if (score >= 70) printf("C\n"); else if (score >= 60) printf("D\n"); else printf("E\n"); return 0; }

知识点总结与易错点

if语句嵌套的核心知识点:

  • if语句嵌套允许处理多种条件分支情况
  • 一般形式:if-else if-else结构
  • else总是与上面最近的尚未配对的if配对
  • 可以使用花括号{}改变配对关系

常见易错点:

  • 错误1:误以为else与缩进对齐的if配对

    示例:

    if (a > b) if (b > c) printf("abc"); else // 这个else实际上与if(b>c)配对,而不是if(a>b) printf("cba");
  • 错误2:忘记使用花括号导致逻辑错误

    示例:

    // 错误写法:本意是a>0时执行两个语句,但实际只执行第一个 if (a > 0) printf("正数"); printf("且大于0"); // 这行总是会执行 // 正确写法: if (a > 0) { printf("正数"); printf("且大于0"); }
  • 错误3:条件判断中使用赋值运算符=而不是比较运算符==
    if (a = 5) { ... } // 错误:将5赋值给a,然后判断a的值(总是真) if (a == 5) { ... } // 正确:判断a是否等于5

编程建议:

  • 始终使用花括号明确代码块范围,即使只有一条语句
  • 保持一致的缩进风格,提高代码可读性
  • 复杂条件判断时,可以拆分成多个简单if语句或使用函数
  • 使用注释说明复杂逻辑的判断条件