if a and b:#如果a是false,那么跳过b的判断,结果直接false
if a or b:#如果a为true,那么跳过b的判断,直接true
比如:3 and 4 == 4,而 3 or 4 == 3
一休:愚公,我又碰到问题了,请看下面一段代码:
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)
我们按照优先级可以加上括号:
(not 1) or (0 and 1) or (3 and 4) or (5 and 6) or (7 and 8 and 9)
#== 0 or 0 or 4 or 6 or 9
#== 4