逻辑操作符有哪些?
在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)
感兴趣的小伙伴可以看看哦~