首先要理解逻辑操作符是什么,它就像我们的头脑一样对c语言的各种各样条件语句进行判断;
逻辑运算符提供逻辑判断功能,⽤于构建更复杂的表达式,主要有下⾯三个运算符。
简单介绍一下各个功能:
!:逻辑取反运算符(常常用于改变表达式的真假);
&&:与运算符,即我们常说的并且的意思(口诀:全真即真,一假即假);
|| :或运算符,即我们常常说的有就行(口诀:有真即真,全假即假);
而真真假假在c语言当中也就是‘1’和‘0’;
为了弄清楚&&和||的区别,因为我们常常在写代码的时候一下子分不清楚他们之间的区别,我举一个简单的例子;
&&:老师让后排的张三和李四去搬书,书很多需要两个人去搬,不然10分钟内搬不完,那么显而易见,只有张三李四都去才能搬完也就是(1,1,真)否则无论只有张三去(1,0,假),还是只有李四去(0,1,假)或者他们都不去(0,0,假)结果都是搬不完;
对照下面表格就能看明白了:
张三(a) | 李四(b) | 搬书(a&&b) |
0 | 1 | 0 |
1 | 0 | 0 |
1 | 1 | 1 |
0 | 0 | 0 |
张三(a) | 李四(b) | 搬书(a||b) |
0 | 1 | 1 |
1 | 0 | 1 |
1 | 1 | 1 |
0 | 0 | 0 |
然后主要想介绍的还是一个关键 短路
什么是短路问题?
C语⾔逻辑运算符还有⼀个特点,它总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是 保证的。 如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
当我们左边的判断条件a>=3已经为假右边的表达式将不再进行判断,因为就算判断为真但是&&的运算来看整个判断条件依旧为假,所以右边操作就不执行;所以,对于&&操作符来说,左边操作数的结果是0的时候,右边操作数就不再执⾏。
所以看这个代码的结果就可以清楚推理出来:
a = a++ && b++ && c++;从左向右来看a=0,所以对于第一个判断即为假不对后面的表达式进行求值,所以结果为:
改变一下就可以了(也可以改成前置++)
这就是&&的短路问题。同样||也存在短路问题;
||的判断逻辑来看当第一个表达式判断为真时,就不对后面的表达式进行判断。
下面是一个例子:
这里有个先后的问题,后置++先判断,由于a为真,所以不在对a进行求值,有人可能会这犯难。
不难看出当第一个表达式为真时,||不对后面的表达式进行操作。
这也就是短路问题。