逻辑运算符优先级

时间:2013-05-28 05:20:48

标签: java

通过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) )
;

但我仍然得到相同的输出。

为什么运算符优先级在这种情况下不起作用?

6 个答案:

答案 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)

试试这个

if(  x++  >  2  &&   ++y  >  2  ||  true    )

您正在使用bitwise运营商而不是logical运营商

Operators in java

答案 3 :(得分:1)

即使运算符|具有更高的优先级,也不会在程序检查是否需要计算右侧(&&)时发现运算符。

考虑语句(true && true | true)。这就是它的计算方法:

  1. 检查(true && ...)以查看是否需要进一步操作(这种情况)。
  2. 更高的优先级:执行操作(true | true) - &gt; true
  3. 优先级较低:执行操作(true && true) - &gt; true
  4. 在您的情况下,由于(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”(|),或者完全是 一个“开”(^)。