3.2.3 if语句的嵌套
前面所介绍的if语句允许用户选择是否执行某一操作,if···else语句允许用户在两个操作中选择某一执行。不过,在实际运用中可能存在两种以上的选择,把if···else语句稍加扩展就能满足要求。
您的浏览器不支持HTML5视频标签。
if语句嵌套的一般形式:
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\) 值。
#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配对,除非用花括号来改变。
// 例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);
显示答案
答案: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
解析: 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
解析: 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");
显示答案
答案: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;
}