1

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

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

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

4

6 回答 6

5

那不是逻辑运算符。这就是位运算符。它将评估所有内容 - 也就是说,它不会短路 - 如果有任何东西将该位翻转为 1,它将保持在 1 直到被否定。

以下是这些陈述的评估方式:

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

  • x++ > 2 && (++y > 2 || true)-> ,因为我们会因为不真实false而短路。x > 2

如果您实际上不想要短路行为,那么也使用按位与,您将获得预期的评估块。

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

于 2013-05-28T05:22:41.797 回答
2

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

我明白你现在真正在问什么。你想知道为什么 if&&的优先级最低,语句的其余部分在最终到达它之前没有被评估。所以在

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

它应该评估x++ > 2,然后++y > 2 | true最终应用&&。嗯,答案是&&应用短路评估。当然,它可以评估所有内容,然后应用其效果,这就是按位运算符所做的。然而这并不是因为

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

应该表现得类似于

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

运算符优先级如您所料,但是,由于 operator 的属性,评估提前终止。所以回到

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

我们看到那x++ > 2是假的,所以++y > 2 | true没有被评估。

于 2013-05-28T05:22:16.867 回答
1

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

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

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

在你的情况下,因为(x++ > 2)给了false,右手边&&从来没有被触及过。

于 2013-05-28T05:54:33.917 回答
1

尝试这个

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

您使用的是bitwise运算符而不是logical运算符

Operators in java

于 2013-05-28T05:22:43.463 回答
0

逻辑运算符: (&&、||、&、| 和 ^) 只能用于计算两个布尔表达式。

&& 和 & 之间的区别在于,如果左侧的计算结果为 false,则 && 运算符不会费心测试右侧的操作数,因为 && 表达式的结果永远不会为真。

|| 的区别 和 | 是那个|| 如果左边的计算结果为真,则运算符不会费心测试右边的操作数,因为此时已经知道结果为真。

位运算符:(&、| 和 ^)也可以称为“位”运算符。位运算符逐位比较两个变量,并返回一个变量,其位已根据被比较的两个变量的相应位是否为“on”(&)、一个或另一个“on”(|) ,或者恰好是一个“开”(^)。

于 2013-05-28T06:16:36.683 回答
0

因为无论你放置大括号,它都会从左到右开始,因为它在 && 的情况下,它被优化为检查第一个条件,它得到假,那么为什么要进入第二个条件,无论大括号是否存在 ,其次 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 > 2 评估为真 | 布尔值之间基于按位或给出输出,true OR true为真。

于 2013-05-28T05:33:07.333 回答