C语言控制流程:条件结构

多重if

前面讨论了简单的条件结构。条件结构用于实现需要判断的情况,它以一个逻辑条件成立与否为条件,决定一个操作的执行或不执行,或执行两个不同的操作。前面介绍的if和if-else结构,它是C语言中实现判断的两种方法,可以实现一个逻辑条件的判断。在某些情况下,需要检查多重条件,解决这种情况可用多重if、嵌套if或switch结构来解决,
C语言的多重if语句是一种条件控制结构,它允许在代码中检查多个条件,并根据条件的结果执行相应的操作。多重if结构的语法如下:
if(<条件1>)
<语句块>
else if(<条件2>)
<语句块>
else if(<条件3>)
<语句块>
   ……
   else
<语句块>

这种结构是从上到下逐个对条件进行判断,一旦发现条件满足就执行与该条件相关的语句,并跳过其他的条件判断;若没有一个条件满足,则执行最后一个else后的语句块;如果没有最后的else语句,则不执行任何操作,执行该结构后面的语句。同样,语句块中包含多条语句时,必须使用“{”和“}”把多条语句括起来。

下面是一段示例代码:
#include <stdio.h>


int main() {
   int x = 10;
   
   if (x > 0) {
      if (x > 5) {
         printf("x is greater than 0 and 5\n");
      }
   }
   
   return 0;
}
在这个例子中,我们首先定义了一个整数变量x并将其初始化为10。接下来,我们使用两个嵌套的if语句来检查x的值。首先,外部if语句检查x是否大于0。如果这个条件为真,那么它就会执行内部if语句,检查x是否大于5。如果这个条件也为真,那么就会打印一条消息表示x同时大于0和5。
需要注意的是,在C语言中,if语句后面的条件必须用括号括起来,并且每个条件后面都必须是花括号用于包含条件为真时要执行的代码块。如果条件为假,则跳过该代码块并继续执行下一条if语句,可以根据需要嵌套多个if语句来检查多个条件。但是要注意避免嵌套层次过多,否则会使代码难以阅读和维护。

嵌套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( 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。如果任何条件不满足,则不会执行相应的操作。

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结构时,应注意以下几点
(1)在case后的常量表达式的值不能相同,否则会出现错误;

(2)在case后,允许有多个语句,可以不用{}括起来;
(3)每个case子句的先后顺序可以变动,而不会影响程序执行结果;
(4)default语句可以省略。

条件运算符

前面内容介绍了条件结构,并通过示例探讨了该结构的各种不同方法。C语言还提供了一种称为“条件运算符”的特殊运算符,它可以用于条件表达式中,以提供与if-else等同的结构。此运算符是?和:符号的组合,它是一个三目运算符,即具有三个参与运算的操作数,其语法规则如下:
表达式1 ? 表达式2:表达式3
其中,表达式1返回1(真)或0(假),其值可以为真,也可以为假。如果表达式1的值为真,则以表达式2的值作为整个条件表达式的值。否则,以表达式3的值作为整个条件表达式的值。条件运算符通常用于赋值语句中。其工作原理可以用图片形式进行描述,如下图所示。
图 4-1条件运算符的工作原理
例如,要找出两个数字中的最大值,可以编写:
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-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);
}