通过Java运算符优先级表:
'|'逻辑OR运算符的优先级高于“&&”逻辑AND运算符。
我使用以下代码
检查了上述事实int y = 5;
int x = 2;
if( x++ > 2 && ++y > 2 | true )
; //do nothing
System.out.println("x = " + x + " y = " + y);
但在上面给出输出的行 -
x = 3 y = 5
显示x ++正在首先评估。
即使我把括号放在|周围的条件下
if( x++ > 2 && (++y > 2 | true) )
;
但我仍然得到相同的输出。
为什么运算符优先级在这种情况下不起作用?
答案 0 :(得分:5)
那不是逻辑运算符。这是按位运算符。它将评估所有内容 - 也就是说,它不会短路 - 如果有任何东西将该位翻转为1,它将保持为1直到被否定。
以下是这些陈述的评估方式:
x++ > 2 && ++y > 2 || true
- > true
。我们使用逻辑AND失败,但是使用逻辑OR成功。由于短路,我们不会继续评估逻辑AND的任何部分,因为x > 2
是错误的。
x++ > 2 && (++y > 2 || true)
- > false
,因为x > 2
因为x++ > 2 & ++y > 2 | true
不正确而导致我们短路。
如果您实际上不想要短路行为,那么也使用按位AND,您将得到预期的评估块。
true
仍将评估为3
,但x 和 y的值将分别更改为6
和{{1}}。< / p>
答案 1 :(得分:2)
|
是按位OR运算符。您正在寻找||
。它类似,但不同之处在于它具有更高的优先级并且不适用于短路评估。
我看到你现在真正要问的是什么。您想知道为什么如果&&
具有最少的优先级,则在最终到达之前不会评估该语句的其余部分。所以在
x++ > 2 && ++y > 2 | true
它应评估x++ > 2
,然后评估++y > 2 | true
,最后应用&&
。那么,答案是&&
应用短路评估。当然,可以评估所有内容,然后应用它的效果,这就是按位运算符的作用。但不是因为
if (a && b && ...)
应该与
类似if (a) {
if (b) {
...
}
}
运算符优先级与您预期的一样,但是,由于运算符的属性,评估会提前终止。所以回到
x++ > 2 && ++y > 2 | true
我们发现x++ > 2
为false,因此未评估++y > 2 | true
。
答案 2 :(得分:1)
答案 3 :(得分:1)
即使运算符|
具有更高的优先级,也不会在程序检查是否需要计算右侧(&&
)时发现运算符。
考虑语句(true && true | true)
。这就是它的计算方法:
(true && ...)
以查看是否需要进一步操作(这种情况)。(true | true)
- &gt; true
。(true && true)
- &gt; true
。在您的情况下,由于(x++ > 2)
提供了false
,因此&&
的右侧从未被触及过。
答案 4 :(得分:0)
因为无论你放置大括号,它都将从左到右开始,因为它是&amp;&amp; ,它是优化检查第一个条件,它得到假,然后为什么要进入第二个条件,无论是否有支撑,其次x ++将被执行,条件得到假,所以它打印相同的输出但是当你会说使用||
class Test{
public static void main(String[] args) {
int x=2,y=5;
if( x++ > 2 || (++y > 2 | true) )
;
System.out.println(x +" "+y );
}
}
它将打印3 6
因为||发生,第一个条件变得虚假但是当它变成第二个时,++ y&gt; 2评估为真|在布尔值之间根据按位OR给出输出,true OR true
为真。
答案 5 :(得分:0)
逻辑运算符:(&amp;&amp;,||,&amp;,|和^)只能用于评估两个 布尔表达式。
&amp;&amp;和和&amp;就是&amp;&amp;操作者 如果左计算结果为false,则不会打扰测试右操作数,因为 &amp;&amp;和表达永远不可能是真的。
||之间的区别和|是 那个||如果左计算结果,运算符将不会打扰测试右操作数 是的,因为在那时已经知道结果是真的。
按位运算符:(&amp;,|和^)也可以称为“按位”运算符。按位运算符逐位比较两个变量,并返回一个变量 其位是根据被比较的两个变量是否已经设置的 相应的位既可以是“开”(&amp;),也可以是“on”(|),或者完全是 一个“开”(^)。