一、多重if
前面讨论了简单的条件结构。条件结构用于实现需要判断的情况,它以一个逻辑条件成立与否为条件,决定一个操作的执行或不执行,或执行两个不同的操作。前面介绍的if和if-else结构,它是C语言中实现判断的两种方法,可以实现一个逻辑条件的判断。在某些情况下,需要检查多重条件,解决这种情况可用多重if、嵌套if或switch结构来解决。
C语言的多重if语句是一种条件控制结构,它允许在代码中检查多个条件,并根据条件的结果执行相应的操作。多重if结构的语法如下:
这种结构是从上到下逐个对条件进行判断,一旦发现条件满足就执行与该条件相关的语句,并跳过其他的条件判断;若没有一个条件满足,则执行最后一个else后的语句块;如果没有最后的else语句,则不执行任何操作,执行该结构后面的语句。同样,语句块中包含多条语句时,必须使用“{”和“}”把多条语句括起来。
if(<条件1>)
<语句块>
else if(<条件2>)
<语句块>
else if(<条件3>)
<语句块>
……
lse
<语句块>
例【1】多重if练习
编写一个程序,根据用户输入的考试成绩,输出相应的成绩评定信息。成绩大于等于90分输出“优”;成绩大于等于80分小于90分输出“良”;成绩大于等于60分小于80分输出“中”,成绩小于60分输出“差”。
程序清单 sample.c
#include <stdio.h>
int main()
{
int score;
//提示用户输入考试成绩
printf("请输入考试成绩:");
scanf("%d",&score);
//判断成绩范围并输出
if(score >= 90)
printf("%d:优",score);
else if( (score >= 80) && (score < 90) )
printf("%d:良",score);
else if( (score >= 60) && (score < 80) )
printf("%d:中",score);
else
printf("%d:差",score);
}
程序声明了一个整数类型的变量score,用于存储用户输入的考试成绩。然后,使用if-else-if结构判断score变量中的值满足那个if语句中的条件。如果第一个if条件返回结果为假,则依次检查else if语句,任何一个else if条件返回结果为真时,则执行该else if下的语句块,如果都返回为假,则执行else语句。
二、嵌套if结构
嵌套IF是一个条件语句的结构,它用于在编程或逻辑过程中进行多层级的条件判断。它根据一系列的条件表达式进行决策,根据不同的情况执行不同的操作。
嵌套IF语句由两个或更多的IF语句组成,每个IF语句中都有一个或多个条件表达式作为判断条件。当且仅当每个IF语句中的条件都为真时,该嵌套IF语句才执行其内部的语句块。
举个例子,假设我们要写一个程序,该程序根据用户输入的成绩,判断学生是否及格和优秀。我们可以使用嵌套IF语句来实现这个功能,伪代码如下:
IF score >= 60 THEN
IF score >= 80 THEN
PRINT "The student is excellent."
ELSE
PRINT "The student is pass."
END IF
ELSE
PRINT "The student is failed."
END IF
在上面的例子中,外层IF语句判断学生是否及格,内层IF语句判断学生是否优秀。如果学生及格,就会进入内层IF语句中进行优秀与否的判断;如果学生不及格,就不会进入内层IF语句,直接输出失败信息。通过这样的嵌套结构,我们可以实现更为复杂的逻辑判断和操作。
C语言嵌套if结构的语法如下:
if(<前提条件>)
{
if(<后续条件1>)
<语句块1>
else
<语句块2>
}
else
<语句块3>
在编写嵌套if结构时,有时会引发一些疑问,下面是一个例子:
if( x > 0 )
if( y > 1 )
z=1;
else /*这个else部分属于哪个if?*/
z=2;
按条件语句的语法形式,上面的例子似乎有两种可能的解释,第一种理解:外层的if是一个没有else部分的条件语句,最后的else部分属于内层的if语句;第二种理解:内层if是一个不带else部分的条件语句,最后的else属于外层的if条件语句。
为了避免这种二义性,C语言规定,每个else部分总是属于前面最近的那个缺少对应的else部分if语句。根据这一规定,上面的例子第一种解释是正确的,第二种解释是不正确的。
因此,在编写代码时,尽量把嵌入的if语句块用“{”和“}”括起来,避免发生理解上的二义性。如果我们真的需要写出具有第二种意义的嵌套条件语句,那么,就应该采用下面的写法:
if( x > 0 )
{
if( y > 1 )
z=1;
}
else /*这个else部分属于哪个if?*/
z=2;
C语言中的嵌套IF结构是一种在条件语句中嵌套另一个条件语句的语法结构。它允许在更复杂的情况下进行条件控制,通过嵌套的条件语句可以更好地处理多个条件之间的关系。
例如:我们可以使用if语句来检查一个条件是否满足,如果满足,则执行一些操作。
if (condition1) {
// 执行操作1
}
再如:我们可以嵌套另一个if语句来检查另一个条件是否满足,如果满足,则执行另一些操作。
if (condition1) {
// 执行操作1
if (condition2) {
// 执行操作2
}
}
在这个例子中,如果condition1为真,则执行操作1,如果condition2也为真,则执行操作2。如果任何条件不满足,则不会执行相应的操作。
还可以使用嵌套if结构来检查多个条件,并在每个级别上执行不同的操作。例如,以下示例展示了如何使用嵌套if结构来检查三个条件:
if (condition1) {
// 执行操作1
if (condition2) {
// 执行操作2
if (condition3) {
// 执行操作3
}
}
}
在这个例子中,如果condition1为真,则执行操作1。然后,如果condition2也为真,则执行操作2。最后,如果condition3也为真,则执行操作3。如果任何条件不满足,则不会执行相应的操作。
采用嵌套结构实质上是为了进行多分支选择,判断两个数值的大小实际上有三种选择,即num1=num2、num1<num2或num1>num2,这种问题用if-else-if结构也可以完成,而且程序更加清晰。因此,在一般情况下,较少使用if的嵌套结构,以使程序更便于阅读和理解。
例【2】嵌套if练习
编程要求:编写一个程序,要求用户输入两个数值,通过嵌套if结构判断两个数值的大小,并输出相应信息。
程序清单 sample.c
#include <stdio.h>
int main()
{
int num1,num2;
//提示用户输入两个整数
printf("请输入两个整数数:");
//获取用户的输入
scanf("%d%d",&num1,&num2);
//用嵌套if结构判断两个数值的大小
//首先判断num1和num2是否相等
if( num1!=num2 )
{
if( num1 > num2 )
{
printf("num1(%d)>num2(%d)",num1,num2);
}
else
{
printf("num1(%d)<num2(%d)",num1,num2);
}
}
else
printf("num1(%d)=num2(%d)",num1,num2);
}
在编写代码时,如果要使用嵌套if结构,尽量把嵌入的if语句块用“{”和“}”括起来,一方面可以提高代码的可理解性和易读性;另一方面也可以预防因if和else匹配错误,使程序发生不可预知的结果,增加程序调试难度。
三、switch结构
在判断过程中,有时需要判断多个条件,需要使用多个else语句,而这样会导致程序冗长乏味,而且还会影响可读性。C语言提供了另一种用于多分支选择的switch结构。如果程序必须进行很多的判断,而且所有判断都取决于同一变量的值,则建议使用switch结构代替一系列的if-else-if结构。
switch结构的语法如下:
switch (表达式){
case 常量表达式 1:
语句块1;
break;
case 常量表达式 2:
语句块2;
break;
case 常量表达式 3:
语句块3;
break;
………
default:
语句块n;
break;
}
其中,switch关键字后的表达式必须是一个整型表达式,即计算后其值为int类型,或可以转换为int的类型,如char等。Case关键字后面的常量表达式要求是整型常量组成的表达式,通常是字符、数字等。
switch选择结构的执行过程如下:
先计算并获得switch后面小括号里的表达式的值,然后将计算结果顺序与每个case后的常量表达式的值进行比较,当找到可匹配的case项后,执行这个case块中的代码,直到遇到break语句,break语句可在执行要求的操作之后,跳出switch语句。
如果任何情况都不满足,则执行switch末尾部分的default语句。该default语句不是必选项,但如果不指定该语句,在任何情况都不满足的情况下,整个switch结构不做任何操作。
在使用switch结构时,应注意以下几点:
- 在case后的常量表达式的值不能相同,否则会出现错误;
- 在case后,允许有多个语句,可以不用{}括起来;
- 每个case子句的先后顺序可以变动,而不会影响程序执行结果;
- default语句可以省略。
例【3】switch练习
编程要求:编写一个程序,根据学生录入的分数,判断学生的级别,其中分数>=90为A;分数>=80为B;分数>=70为C;分数>=60为D;分数<60为E。
程序清单 sample.c
#include <stdio.h>
int main()
{
int score = 0,flag=1;
char grade = 'A';
//获取学生的分数
printf("请输入学生的成绩:\n");
scanf("%d",&score);
switch(score/10){
case 10: grade='A';break;
case 9: grade='A';break;
case 8: grade='B';break;
case 7: grade='C';break;
case 6: grade='D';break;
case 5: grade='E';break;
case 4: grade='E';break;
case 3: grade='E';break;
case 2: grade='E';break;
case 1: grade='E';break;
default :flag=0;
}
if(flag)
{
printf("该学生的等级是%c\n",grade);
}
else
{
printf("分数录入错误");
}
}
用户输入的学生分数存储在score变量中,switch后面的表达式为score/10,将输入的分数缩小10倍,其数值范围约束在0到10之间,然后依次与case语句的常量表达式进行匹配,匹配成功的项,将与分数相对应的级别赋值给字符串类型grade,执行break语句跳出switch结构。如果没有匹配项,则执行default语句,将flag变量设置为0。程序最后是if语句,判断flag的值是否为真,为真则输出该学生的等级,否则输出“分数录入错误”信息。
四、条件运算符
前面内容介绍了条件结构,并通过示例探讨了该结构的各种不同方法。C语言还提供了一种称为“条件运算符”的特殊运算符,它可以用于条件表达式中,以提供与if-else等同的结构。此运算符是?和:符号的组合,它是一个三目运算符,即具有三个参与运算的操作数,其语法规则如下:
表达式1 ? 表达式2:表达式3
其中,表达式1返回1(真)或0(假),其值可以为真,也可以为假。如果表达式1的值为真,则以表达式2的值作为整个条件表达式的值。否则,以表达式3的值作为整个条件表达式的值。条件运算符通常用于赋值语句中。其工作原理可以用图片形式进行描述,如下图所示。

条件运算符的工作原理图
例如,要找出两个数字中的最大值,可以编写:
max = num1 > num2 ? num1:num2;
可以看出,条件运算符需要三个操作数,一个是需要被赋值的操作数,另外两个是参与比较运算的操作数。该语句首先检查表达式num1>num2,判断其值是真还是假。如果此表达式的值为真,即num1>num2,则将num1赋值给max,否则,将num2的值赋值给max。
此运算符等同于如下的if-else结构
if(exprt1)
{
exprt2;
}
else
{
exprt3;
}
上述求较大值的示例等同于:
if(num1>num2)
max = num1;
else
max=num2;
如果在条件语句中,只执行单个的赋值语句时,则可使用条件表达式来实现。不但使程序简洁,也提高了运行效率。
例【4】条件运算符练习
编程要求:编写一个程序,要求用户输入基本工资,计算税后工资。
个人所得税收取规定:工资大于3500元的部分将扣除个人所得税。小于3500元的部分不扣除个人所得税。
程序清单 sample.c
#include <stdio.h>
int main()
{
double sal;
double rate;
printf("请输入基本工资:");
//接收用户输入的基本工资
scanf("%lf",&sal);
rate = ( sal < 3500 ) ? 0 : 0.05;
//计算税后工资
sal = sal - ( sal-3500 ) * rate;
printf("\n 税后工资为:%7.2f \n",sal);
}