啥叫"短路逻辑"

从Python中的理解:

if a and b:#如果a是false,那么跳过b的判断,结果直接false
if a or b:#如果a为true,那么跳过b的判断,直接true

not or and 的优先级是不同的:not > and > or

比如:3 and 4 == 4,而 3 or 4 == 3


从Jave中认清逻辑操作符和短路逻辑操作符

一休:愚公,我又碰到问题了,请看下面一段代码:

double value=0;  
if(value!=0 && 1/value<1000)  
{   System.out.println("The value is not too small.");  
}  
else  
{   System.out.println("The value is too small.");  
} 

把这段代码放入main方法中,运行结果是:

The value is too small 

按道理说应该会出现除数为0的错误,为什么没有出现呢?

愚公:需要注意,这里的条件逻辑操作符”&&”是”短路”操作符,而”value!=0“条件不成立,即短路了,应执行else后的语句,所以不会再判断1/value<1000了。我再编写几条语句给你看看:

public static void main(String[] args)   
{   double int1=0,int2=1,int3=1;  
    if(int1!=0 & (int2=2)==1)  
    {   System.out.println("这里没有执行");  
    }  
    System.out.println("int2="+int2);  
    if(int1!=0 && (int3=2)==1)  
    {   System.out.println("这里没有执行");  
    }  
    System.out.println("int3="+int3);  
}  

读一下这段代码,看看运行结果是什么呢?

一休:还真的有点难读呢!

愚公:把你聪明的大脑当成计算机,一步步执行看看。

一休:哦,首先是一组赋值”int1=0,int2=1,int3=1;”,然后条件判断”value!=0“,现在int1等于0,于是碰到”&”号。

愚公:碰到”&”号要继续判断后面的表达式。

一休:然后执行int2=2,它的值就变成了2,再判断int2==1,两个条件都不满足,所以不执行”System.out.println(“这里没有执行”);“语句。

愚公:那么System.out.println(“int2=”+int2)输出什么呢?

一休:是”int2=2.0“

愚公:再看看语句if(int1!=0 && (int3=2)==1)。

一休:”int1!=0”不满足,那么”&&”后面的条件就不用考虑了。”(int3=2)”没有执行,所以,System.out.println(“int3=”+int3)输出”int3=1.0“。

愚公:对了。

一休:那”||”也是如此吧?

愚公:是的,现在总结一下。

逻辑操作符有:&(与运算)、^(异或运算)、|(或运算)

短路逻辑操作符有:&&(并且)、||(或者)

短路与(或)运算符和逻辑与(或)一样,都可以实现逻辑运算,但是有一个重要的区别:
利用逻辑与(或)运算时,不管操作符两边的条件表达式成不成立,它都要进行运算判断;

而短路与(或)运算就不一样了,如果通过左侧的操作数就可以进行它们需要的判断,那么它就不会再计算右侧的操作数了。

一休:这下我全明白了。


例程:

print(not 1 or 0 and 1 or 3 and 4 or 5 and 6 or 7 and 8 and 9)

我们按照优先级可以加上括号:

(not1) or (0and1) or (3and4) or (5and6) or (7and8and9)
#== 0or0or4or6or9 
#== 4

你可能感兴趣的:(Python,tips)