6.2.2 逻辑运算

我们知道在c语言当中,我们有四则运算+-*/,关系运算><==,赋值运算如"a=b".除了这三种之外,我们还有逻辑运算,

  • 逻辑运算是对逻辑量进行的运算,结果只有0或1.
  • 逻辑量是关系运算或逻辑运算的结果

我们来看我们有怎么样的逻辑运算:c423f0ff8e0645beaec165de48c08d6c.png

如果我们要表达数学中的区间,如:x∈(4,6)或x∈[4,6],应该如何写c的表达式呢?很多同学犯过错误了.他们会直接表达成4<x<6,这不是c语言能正确计算的式子(虽然能编译但是意思不一样),因为4<x的结果是一个逻辑值(0或1),上面这个式子要么是0<6要么是1<6,怎无论样结果都是1,不可能给你判断x是否在4到6中间.因此我们需要写下这样的式子x>4&&x<6.如果是闭区间,则改为x>=4&&x<=6.

那如果我们想要判断一个字符c是否为大写字母呢?c>="A"&&c<="Z",小写字母同理.

我们来理解以下这三条式子:

3ea16ba9b3da43b6912dbe6378de8111.png

第一个式子不再赘述.
第二个式子表明index小于0或者大于99,即index不属于0到99的范围.
第三个式子,虽然逻辑运算符的优先级是低于比较运算符的,可是呢这个!(not)是一个单目运算符,我们又有另外的一条通行的规则,就是单目运算符的优先级要高于双目运算符.所以这条式子的意思是,判断!age是否小于20,age如果是0就会变成1,如果是非0的数就会变成0,都比20小,结果都为1.如果我们要not比较age和20比较的结果,需要加上括号.

这三个运算符的优先级是不一样的.顺序为!>&&>||.那么!done&&(count>MAX)(括号其实没必要)的结果如何呢.!done和括号里面的东西都不为0,结果才为1,否则为0.

各个运算符的优先级如表:

b6113e410efe4e0395c8023b5eb9dc04.png

学过逻辑运算符之后,我们之前的那个程序

b55a7e79e4e34211b409ec147607ac3b.png

可以直接改成

179851697dcf4fc0bc7df3be1b7caa86.png

容易知道,我们可以把

289a740ce84c44e299b001619e310de4.png

也改成

a2b9606459774effa5314fa9e0530efd.png

如果我们把第一个==换成=,我们还能这样改吗?不能.

逻辑运算是自左向右进行的,如果左边的结果已经可以决定最终结果了,就不会再做右边的运算.

  • a==6&&b==1,如果说a==6已经不成立了,那么右边的判断也不会再继续了.
  • a==6&&b+=1,如果说a==6已经不成立了,那么右边的赋值也不会再继续了.

这当然是个好事情,可以提高我们的运算效率.但是如果当左边为false时,你的右边是有赋值的,那它不会再做了.

  • 对于&&来说,左边是false时就不做右边了.
  • 对于||(or or)来说,左边是true时就不做右边了.

这件事情叫做短路.我们来试一下这件事情.

#include<stdio.h>
#include<stdbool.h> 
int main(){
    int a=-1;
    if(a>0&&a++>1){
        printf("ok\n");
    }
    printf("%d\n",a);
    return 0;
    }

得到结果为-1,也就是说在判断a>0为false之后便不再执行右边的运算了.所以,我们希望你不要把赋值,包括复合赋值组合进表达式里.

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值