嵌套的if语句

        如前所述,if语句有以下两种形式。

        if(表达式)语句                

        if(表达式)语句 else 语句

        if语句,顾名思义,是一种语句,因此else控制的语句也可以是if语句。

        首先我们来看看下面这一串代码:

//如果输入的整数值为正,则判断该值的奇偶性并显示
#include <stdio.h>
#int main()
{                                            
    int num=0;                                 运行结果1
    puts("请输入一个整数:");                    请输入一个整数:12
    scanf("%d",&num);                          这个数是偶数      
    if(num>0)
        if(num%2==0)
            puts("这个数是偶数");               运行结果2
        else                                   请输入一个整数:5
            puts("这个数是奇数");               这个数是奇数
    else
        puts("您输入的不是正数");               运行结果3
    return 0;                                  请输入一个整数:-1
}                                              您输入的不是整数
        

        可以看到我,我们在if语句中再一次使用到了if,这就是if的嵌套。当我们使用if语句时,最好把if控制的语句用{ }括起来,否则容易出错,还会导致别人和自己看不懂的情况。

        判断       

        表达式都有值。程序执行时会对表达式的值进行检测,这就称为判断(evaluation)。

        我们在前面说过,if(表达式)里的值为1(真)才进行if里的语句,否则就进行else中的语句。在上面这串代码中,当我们输入12时,会进行第一个if语句的判断,此时12大于0,就进入if下的语句,然后进行第二个if语句的判断结果还是为1,所以可以在看到结果显示"这个数是偶数"。另外两个运行结果都是同样的执行方式。

        注意:表达式都有值。程序执行时会对表达式的值进行判断。

        条件运算符

//显示所输入的两个整数中较大的数
#include <stido.h>
#int main()
{
    int n1,n2,max;                            运行结果
    put("请输入两个整数。");                   请输入两个整数。
    printf("整数1:"); scanf("%d",&n1);        整数1:53        
    printf("整数2:"); scanf("%d",&n2);        整数2:41
    max=(n1>n2)?n1:n2;                        较大的数是53。
    printf("较大的数是%d。",max);
    return 0;
}

        上述代码中出现了条件运算符。该运算符是需要三个操作数的三目运算符。       

        条件运算符  a?b:c 如果a不为0,则结果是b的值,否则结果为c的值   

        就上述代码,当输入53和41时,两个数先进行比较,此时n1=53大于n2=41,结果为1,所以将n1的值赋给max。

        对于条件运算符,我们可以解释为 表达式1?表达式2:表达式3 ,当使用条件运算符时,会先对表达式1进行判断,若表达式1的值不为0(真),那么最终结果为表达式2的值。反之,则为表达式3的值。

逻辑运算符

        这次让我们来思考下面的问题。

        显示出所输入的月份所处的季节。

        3,4,5月是春季,6,7,8月是夏季,9,10,11是秋季,12,1,2月是春季,其他月份存在。

        我们可以像上面那样使用if...else if...。在这里我们需要使用到&&,叫逻辑与运算符。下面我们先来看看它的使用。

//显示所输入的月份所处的季节
#include <stdio.h>
int main()
{    
    int month=0;                                    运行结果1
    puts("请输入月份:");                            请输入月份:5
    scanf("%d",&month);                             5月是春天。
    if (month>3&&month<5)
        printf("%d月是春季。/n",month);              运行结果1
    else if(month>6&&month<8)                       请输入月份:8      
        printf("%d月是夏季。/n",month);              8月是夏天。
    else if(month>6&&month<8)
        printf("%d是秋季。/n",month);
    else if(month==12||month==1||month=2)
        printf("%d是月冬季。/n",month);
    else
        printf("%d月不存在。",month);
    return 0;
}
        

        不仅如此,我们还用到了逻辑或运算符||。下面我们来看看他们两个的区别。   

逻辑与运算符a&&b如果a和b都不为0,则表达式的结果为1,否则结果为0(结果类型为int)
逻辑或运算符                  a| |b如果a和b中有一个不为0,则表达式的结果为1,否则结果为0(结果类型为int)

     ▶&&运算符在a的判断结果为0时不会对b进行判断。而||运算符则相反,当a的判断结果不为0时不会对b进行判断。     

        以上这种情况称为短路求值。下面我们就来讲一下短路求值。        

短路求值

        if语句首先进行的是判断季节是否为“春季”。这里假设变量month的值为2,我们来判断下述表达式。

        month>=3&&month<=5

        左操作数month>=3的判断结果为0。这样的话即使不判断右操作数month<=5,整个表达式的判断结果也为0。

        也就是说,&&运算符在左操作数的判断结果为0时不对右操作进行判断。 

        ||运算符是怎样的呢?这里我们结合下面这个判断季节是否是“冬季”的表达式来看。

        month==12||month==1||month=2

        如果month为1,则根本不用判断month为2或12月的情况,整个表达式的判断结果就为1。

        也就是说,||运算符在左操作数的判断结果不为0时不会对右操作数进行判断。

        我们可以简单概括&&运算符的判断情况为:全真为真,有假则假;而||运算符的判断情况为:有真则真,全假则假。      

        像这样,在仅根据左操作数的判断结果就可知逻辑表达式的判断结果的情况下,不会对右操作数进行判断,这就称为短路求值

        最后我们再来看看我们在if语句中经常出现的错误。

错误1:在判断相等性时候使用=

        请注意不要把判断相等性时使用的==运算符和=混淆。

        误 if(a=0)语句

        正 if(a==0)语句

错误2:判断三个变量的相等性时使用连等

        下面是判断变量a,b,c的值是否相等的例子。

        误 if (a==b==c)

        正 if (a==b&&b==c)

        我们上面说过,如果写成a==b==c这种情况的话,程序首先判断的是a和b是否相等,如果相等则值为1,1再和c比较看是否相等再得到1或0;反之,如果不相等则得到0再和c比较是否相等在得到1和0。因为相等运算符==是双目运算符,所以a==b==c不能实现对三个变量的判断。

错误3:两个条件的判断不适用&&||

        和上一个例子的情况一样。例如,下面是判断变量a是否大于等于3小于等于5的例子。

        误 if(3<=a<=5)

        正 if (a>=3&&a<=5)

        以上就是这篇的内容,有哪里不正确希望大家可以提提意见,改进改进。

        

        

            

        

        

  • 26
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值