关于逻辑操作符及其短路原理

逻辑操作符有哪些?

在C中,有以下三种常见的逻辑操作符

① &&  

这是C语言中常用的逻辑操作符之一,其表示的逻辑意义为:并且/而且

&&的应用场景及其短路原理
&&的应用场景

由于&&的逻辑意义为并且,所以它经常和if语句连用来实现对执行条件的判断

例如,请看下面一串代码:(代码意图见注释)

那么在这个地方,按理说我输入一个20,按照条件的限制,应该打印成年人才对,为啥会打印未成年人呢?

原因在于:关系操作符(也就是如<  >  ==  !=   等一类的表示其操作数之间的关系的符号,这里补充说明一点,操作数就是操作符的控制对象,例如  a==b  中,==  有两个控制对象,它就有两个操作数,所以其又被称为双目操作符,这里不再过多赘述)  尽量不要连用,如果要表示多重条件限制下的判断,要把关系运算符与逻辑运算符连用才行.

啥意思呢? 别急,听小编细细分解~

得在条件不等式上面下文章,对于我们一般人来说,1<age<18,是再正常不过的表达,可是对于编译器来说,这个表达式却会被分成两部分解析,

第一部分是 1<age  ,而我输入的是19,所以对这一部分来说,1<age  是一个真命题,而对C的设定来说,真命题的关系表达式会被在编译时会被解析为1(即非0为真,0为假,而非0一般返回1)  如此一来,原本的  1<age<18  就变成了  1<18   为真命题,对于if 语句来说,判断表达式为真时,就执行目标语句,所以就会执行printf命令,打印未成年人.

那么如何避免这种情况呢?

看我的注释哟

看我魔改后的代码:

要避免这种情况,就需要  &&  操作符. 1<age&&age<18 表示age在大于1的同时,也要小于18才行.

所以这个代码才达到了预想的效果.  

&&短路原理

对于&&来说,它具有两个操作数,只有两个操作数都为真时,此逻辑表达式才为真,所以要计算左右两边的表达式的真假.

请看下面一串代码:

判断输出结果:

&&操作符要计算左右两边表达式的值才能确定真假,所以:

计算a++,此为后置++,先使用,再++,由于a=0被用于表达式中,所以a++&&++b为假,也就是++b没有执行,进而整个表达式为假,i返回0,由于++b和d++都没有被执行,所以它们仍然是原来的值,所以i=0,a=1,b=2,c=3,d=4

输出验证:

(注:之所以会在每一行前面打印一个逗号,是因为在代码中\n后面加了  .  或,)

再来一个试试水:

这次再来看看:

第一步:a++  ,此时先使用,把a=1带入表达式中,由于a为非零, 所以不能直接判断真假, a自增1后变为2

第二步:++b,此时先加加,把b的值自增1再带入表达式当中,b=3.   a和b都为真,a&&b也为真

第三步:d++,将d=4带入,此时整个表达式为真,i=1,d自增变为5

即 i=1,a=2,b=3,c=3,d=5\

来看一下运行结果:

看吧,对了吧!

② ||  

||  的应用场景及短路原理
||  的应用场景

|| 在C中表达的是或者的意思,跟&&一样,||也经常用于条件判断

如判断弱势群体:(定义弱势群体是未成年人.老人和妇女)

(注:这里有关strcmp的介绍,详情参见:cplusplus.com/reference/cstring/strcmp/)

(这里只列出strcmp的主要部分)

下面来测试输出:

 在此可以看到,即使age<18或者age>=60 的条件都不满足时,只要性别为女,就可以打印出弱势群体.
 

||  的短路原理:

由于|| 的意思是或者, 所以在处理短路时,只要左右两个操作数有一个为真,其整个条件判断就为真,这意味着只要其中一个为真,另一个就不会被执行.而只有当左右两个操作数都为假时,整个表达式才为假.这意味着第一个操作数为假时,两个操作数都要执行.

咱们光说不练假把式,迅速分析下面一段代码:

通过刚才的分析得出:a=1,b=3,c=3,d=4 同时 i=1

检测运行:

(叮咚~)你做对了嘛?

那么再来一个看看吧!

(注:其中①代表前两个表达式,②代表前三个表达式(也就是整个表达式)(与上一个短路示例中的①和②一样)

通过上面的分析,a=2,b=2,c=3,d=4 同时i=1

检测运行:

你做对了嘛?

③ !

!  的应用场景

在C中,  !   用来表示逻辑取反操作.

例如: int  flag = 0;  (为假)

那么 ! flag =1  (为真)

反之: int flag =1;  (为真)

那么:  ! flag=0  (为假) 

因此,它也常用于逻辑条件判断.来看下面一段代码:

检测运行结果:

④总结

好啦,接下来总结一下下~

1. 对于连用的&&的短路:从左到右执行,如果执行过程中任何一个表达式为假,则停止执行,且整个表达式返回0,.

 2. 对于连用的||的短路:从左到右执行,如果执行中任何一个表达式为真,则停止执行,且整个表达式返回非0值(通常返回1)

3,  对于逻辑反操作:把真变成假,把假变成真.

 好啦~,这一篇就到这里,咱们下一篇再见!

另外,这一片所有的代码我都放在:test 4_9~4_10/add.c · 等同于/C.src - 码云 - 开源中国 (gitee.com)

感兴趣的小伙伴可以看看哦~

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值