我不明白&&和和||在某种程度上。
If(a && b) { then do this }
现在,如果a为false,则b 会查看,但不会测试该条件。
但是....
If(a || b) { then do this }
现在,如果a为真,那么b 不是 ,并且不会测试条件。
为什么会这样。我想到了&& amp;和||是为了帮助加快速度。如果它可以通过测试第一个条件来确定结果,则不需要查看第二个条件。但是对于&&它确实看着它。而在||的情况下它很有意义。
我有这个权利吗? 如果我这样做,为什么会这样?
答案 0 :(得分:7)
要理解答案,请提醒自己AND
和OR
操作的真值表:
AND true | false
\--------+-------
true | true | false
------+-------+-------
false | false | false
OR true | false
\--------+-------
true | true | true
------+-------+-------
false | true | false
请注意AND
的第二列和OR
的第一列:它们具有相同的值。这是理解AND
在第一个求值为false
时忽略第二个参数的原因的关键:当第二个参数无关紧要时(第二列)。对于OR
运算符则相反:现在第一个参数中的false
表示第二个参数确实重要。但是,第一个参数(第一列)中的true
表示可以忽略第二个参数。
我想到了&&和||是为了帮助加快速度。
这是他们目的的一小部分。更大的一个是基于左侧保护表达的右侧。考虑一种您希望防范空{和null
字符串的情况。如果&&
和||
没有“短路”评估,您将被迫编写如下代码:
if (s == null) return false;
if (s.length() == 0) return false;
你可以写的原因
if (s == null || s.length() == 0) return false;
是短路:保证s.length()
字符串不会调用null
。
答案 1 :(得分:2)
&& is AND where as || is OR operator.
&&寻找假,意味着如果第一个参数为假,它不会测试第二个是真还是假。
||寻找真实,意味着即使第一个参数为假,它也会测试第二个。如果两者都是假的则为假,否则为真。在&& case都是true然后是true否则为false。
答案 2 :(得分:1)
&&
用于执行and
操作,如果expression/condition
中的任何一个评估为false,则整个事件都是错误的。
so if any one of the condition becomes false it won't even continue further to check
||
用于执行or
操作,如果expression/condition
中的任何一个评估为真实的事情都会变为真。
so it continues till the end to check atleast one condition to become true.
答案 3 :(得分:0)
a && b
不能为true,因此如果确实为false,则无需检查b。
a || b
不能为假,所以如果确实如此,则无需检查b。
出于这个原因,他们被称为短路运营商。
如果你试图打败这种行为,请使用&和|代替。
答案 4 :(得分:0)
嗯...关于机会,问题是你对&&和当左侧操作数为假时,运算符计算右侧操作数,然后读取:
Conditional And Operator (Java Language Specification)
具体来说,第一句话是:
条件和操作员&&就像& (§15.22.2),但评估 只有当左侧操作数的值为时,它的右侧操作数 真。
和最后一个:
因此,&&计算与&相同的结果在布尔操作数上。它有所不同 只是因为评估了右侧操作数表达式 有条件而不是总是。