2013-05-28 63 views
1

通过Java运算符优先级表:逻辑运算符优先级

'|'逻辑或运算符的优先级高于'& &'的逻辑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)) 
; 

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

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

回答

5

这不是逻辑运算符。这是一个按位运算符。它会评估一切 - 也就是说,它不会短路 - 如果有什么东西翻转到1,它将保持在1直到否定。

这里的这些言论会如何评价:

  • x++ > 2 && ++y > 2 || true - >true。我们失败的逻辑与,但成功的逻辑或。由于短路,我们不会继续评估逻辑AND的任何部分,因为x > 2是错误的。

  • x++ > 2 && (++y > 2 || true) - >false,因为我们将由于x > 2短循环不成立。

如果你真的不想要的短路行为,然后用按位与,以及,你会得到你预期的评价块。

x++ > 2 & ++y > 2 | true仍然将评估为true,但X 的y的值将分别变更为36

+1

Actully我使用| oprator有意,如果|运算符具有比&&高的优先级,那么为什么&&比|更早执行。 –

+0

我不这么认为。您将在逻辑AND的任一侧应用所有按位运算,然后应用逻辑AND。你也会得到一点红鲱鱼 - 你实际上不会在逻辑块中做任何事情,所以你怎么能绝对肯定你没有得到你想要的结果呢? – Makoto

+0

因为如果| evalute before &&,那么y应该有6个输出。 –

2

|是按位或运算符。您正在寻找||。它是相似的,但不同之处在于它具有更高的优先级并且不适用于短路评估。

我明白你现在真正想问什么。您想知道为什么如果&&的优先级最低,那么在最后才会对其余的语句进行评估。因此,在

x++ > 2 && ++y > 2 | true 

应该评估x++ > 2,然后++y > 2 | true终于申请&&。那么,答案是&&适用于短路评估。当然,它可以评估一切,然后应用其效果,这就是按位运算符所做的。然而,它不会因为

if (a && b && ...) 

应该是类似的行为

if (a) { 
    if (b) { 
     ... 
    } 
} 

运算符优先级如您所愿,但是,评估被提前终止,因为运营商的财产。所以回到

x++ > 2 && ++y > 2 | true 

我们看到,x++ > 2是假的,所以++y > 2 | true不计算。

+0

不,我查找|运营商。如果|运算符具有比&&高的优先级,这与为什么&&比|执行之前要高。 –

+0

@VijendraSingh我明白你的意思了。我编辑了我的答案。 – Zong

+0

@ZongLi你可以显示代码是如何解析的。 '(x ++> 2)&&(++ y> 2 | true)'。 –

1

试试这个

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

您使用bitwise运营商不logical操作

Operators in java

0

因为无论你放在括号,它​​将开始从左至右因为它的情况下, & &,它优化了检查第一个条件,它是假的,那么为什么要去第二个条件,否事件大括号,其次x ++将得到执行,条件变为false,所以它打印的是相同的输出,但是当你确实说出使用||时。

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> 2被评估为真|布尔值之间给出输出的基础上按位或,true OR true是真实的。

1

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

考虑陈述(true && true | true)。这是如何计算的:

  1. 检查(true && ...)以查看是否需要进一步的操作(这是这种情况)。
  2. 更高优先级:执行操作(true | true) - >true
  3. 优先级较低:执行操作(true && true) - >true

在你的情况下,由于(x++ > 2)给人false&&右手侧是从来没有碰过。

0

逻辑运算符:(& &,|| &,|和^)可以仅用于评价2个 布尔表达式。

& &和&之间的区别是,& &操作 不会打扰测试右操作数,如果左边的计算结果为假,因为& &表达的 结果永远是正确的。

||和| ||是 ||如果左边的计算结果为 为真,操作员不会打扰测试右边的操作数,因为结果在该点上已经是真实的。

按位运算符:(&,|和^)也可以称为“按位”运算符。按位运算符逐位比较两个变量,并返回一个变量 ,该变量的位数已根据所比较的两个变量是否为“开”(&),其中一个或另一个“on”( |),或者确切地说 一个“开”(^)。