C语言短路简介
C语言的短路现象一般出现在逻辑运算符上,它有⼀个特点,就是总是先对左侧的表达式求值,再对右边的表达式求值,这个顺序是保证的。
如果左边的表达式满⾜逻辑运算符的条件,就不再对右边的表达式求值。这种情况称为“短路”。
逻辑与的“短路”
逻辑与操作符&&的规则是:只要有任何一边为假,那么结果就为假,只有两边同时为真,那么结果才为真,那么逻辑与怎么产生短路的呢?比如以下代码:
if(month >=4 && month <=6)
上述代码会先判断输入的month是否大于等于4,如果输入的month的值不大于等于4,也就是已经有一边的结果为假,那么接下来就不会判断后面的小于等于6的条件,会直接返回假值,这就叫“短路”。如果输入的month的值大于等于4,才会对后面的小于等于6作判断。
逻辑或的“短路”
对于逻辑操作符||是怎么样的呢?比如以下代码:
if(month == 12 || month==1 || month == 2)
逻辑或操作符||的规则是:只要有任何一边为真,那么结果为真,只有两边同时为假,那么结果才为假。当我们输入一个month值时,如果输入的是11时,表达式就会直接返回真,而不会继续后面的判断,这就是逻辑或的“短路”,如果输入的不是12,1,2中的值,才会一一判断,最后返回假。
练习:
练习1:
试着计算以下代码的运行结果:
练习2:
练习答案及解析
练习1:
答案:
解析:
为什么会得到这样的结果呢?这就要运用到我们今天学习到的短路,在逻辑与中,只要与上的表达式中有一个为假,那么结果就为假,只有全为真,结果才为真。
如果在前面判断时已经遇到假,那么就会短路,不再执行后面的语句,直接返回假。
在上述例子中,首先判断a++的结果,我们前面讲过,后置++是使用原本的值放在表达式中,使用完后再对a进行自增1,由于a被初始化为0,所以在表达式中直接使用了0,再对a加1,此时a变成1,但是由于0表示假,在逻辑与中碰到假,不会再对后面的表达式进行判断,直接短路,由此可以得出,只有a加1后变成了1,其他的变量不会发生变化,就得到了如上的结果。
练习2
答案:
解析:
在逻辑或中,只要有一个条件为真,那么结果就返回真,只有全为假才会返回假。
如果在前面判断时已经碰到真,那么就不再判断后面的表达式,直接返回真,这就是逻辑或的短路。而只有碰到假才会继续判断后面的表达式。
在这里,由于后置++的a被初始化为0,所以在表达式中直接使用了0,再对a加1,此时a变成1,由于使用的0表示假,所以会继续判断后面的表达式。
此时来到后面一个表达式,前置++的b被初始化为了2,前置++的规则是先自增1,再使用,此时b就是3,而在C语言中,非零为真,此时逻辑与操作符遇到了真,就短路了,直接返回真,不会再判断后面的表达式,所以结果就是a加1变成1,b加1变成了3,其余值不变。