3.6、if的嵌套

By | 2015年10月25日

在3.1中我们简单的学习了if的使用

在程序中使用if流程语句可以改变运行的流程

但是在很多情况下,仅仅只在一种情况下改变流程是不够的

例如我们可能需要在满足某一个条件下,继续判断其它条件,并执行对应操作。

假如我们需要一个判断闰年的程序

我们知道,闰年的判断法则是在不能被100整除的年份里,能被4整除为闰年;能被100整除的年份里(即整百年),能被400整除才是闰年

例如2000和2004均为闰年,2100和2010均不是闰年

这样我们便涉及到了多次判断的问题

完成这个功能的程序如下:注(leap year即为闰年)

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int year = 0;
    printf("Please input the year you want to judge:");//输入需要判断的年份
    scanf("%d", &year);

    if(year % 100)      //如果不能被100整除,那么表达式的值不为0,即为真
    {
        //不能被100整除的时候直接判断
        if(year % 4)
        {
            printf("The year %04d is not a leap year!\n", year);//不是闰年
        }
        else
            printf("The year %04d is a leap year!\n", year);//是闰年
    }

    else
    {
        //否则说明是“整百年”,使用400判断
        if(year % 400)
        {
            printf("The year %04d is not a leap year!\n", year);
        }
        else
        {
            printf("The year %04d is a leap year!\n", year);
        }
    }
    return 0;
}

运行程序后

运行结果 2100不是闰年

运行结果
2100不是闰年

现在我们来分析程序

第10行的if将年份能否被100整除分为两种情况

对输入的年份进行%求余操作时,如果余数不为0,也就是真的时候,表示无法被100整除

此时,我们在if的结构内进行处理

直接判断年份能否被4整除,原理同上

同样,在else中也类似

注意第18行

这里的else并没有写大括号,因为在后面只跟有1个语句时大括号是可以省略的

这意味着我们可以写成这样

#include <stdio.h>
#include <stdlib.h>

int main()
{
    int year = 0;
    printf("Please input the year you want to judge:");//输入需要判断的年份
    scanf("%d", &year);

    if(year % 100)      //如果不能被100整除,那么表达式的值不为0,即为真
    {
        //不能被100整除的时候直接判断
        if(year % 4)
            printf("The year %04d is not a leap year!\n", year);//不是闰年
        else
            printf("The year %04d is a leap year!\n", year);//是闰年
    }

    else
    {
        //否则说明是“整百年”,使用400判断
        if(year % 400)
            printf("The year %04d is not a leap year!\n", year);
        else
            printf("The year %04d is a leap year!\n", year);
    }
    return 0;
}

同样,因为if-else属于一个完整的结构

因此最外层的if-else的大括号同样可以省略

于是乎程序就成了这样(仅给出if-else部分)

    if(year % 100)      //如果不能被100整除,那么表达式的值不为0,即为真
        //不能被100整除的时候直接判断
        if(year % 4)
            printf("The year %04d is not a leap year!\n", year);//不是闰年
        else
            printf("The year %04d is a leap year!\n", year);//是闰年
    else
        //否则说明是“整百年”,使用400判断
        if(year % 400)
            printf("The year %04d is not a leap year!\n", year);
        else
            printf("The year %04d is a leap year!\n", year);

不用怀疑,将此代码复制并且覆盖掉前面的代码,结果是完全一样的

于是乎这样又涉及到了一个else和哪一个if配对的问题

c语言中规定else永远和最近的未配对的if配对

这就是说,如果一个像下面的程序

if(xxx)
    if(xxx)
    xxx;
else
xxx;

尽管这里的else缩进和第一个if相同,但是由于以上的规定,它和第二个if组成if-else结构

而不是第一个

2 thoughts on “3.6、if的嵌套

发表评论

邮箱地址不会被公开。 必填项已用*标注