首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >逻辑算子优先

逻辑算子优先
EN

Stack Overflow用户
提问于 2013-05-28 05:20:48
回答 6查看 903关注 0票数 1

通过Java操作符优先级表:

逻辑OR运算符比‘&’逻辑运算符具有更高的优先级。

我使用以下代码检查了上述事实

代码语言:javascript
复制
int y = 5;
int x = 2;
if(  x++  >  2  &&   ++y  >  2  |  true    )
; //do nothing
System.out.println("x = " + x + " y = " + y);

但在线上,输出值为-

代码语言:javascript
复制
x = 3 y = 5

显示x++首先进行评估。

就连我都把括号放在了x附近

代码语言:javascript
复制
if(  x++  >  2  &&   (++y  >  2  |  true) )
;

但我还是得到了同样的输出。

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

EN

回答 6

Stack Overflow用户

回答已采纳

发布于 2013-05-28 05:22:41

这不是逻辑操作符。那是位操作符。它将评估一切-也就是说,它不会短路-如果有任何东西翻转到1,它将保持在1,直到否定。

以下是这些声明的评估方法:

  • x++ > 2 && ++y > 2 || true -> true.我们在逻辑上失败了,但逻辑或成功了。通过短路,我们不会继续计算逻辑的任何部分,因为x > 2是假的。
  • x++ > 2 && (++y > 2 || true) -> false,因为x > 2不是真的,所以我们会走捷径.

如果您实际上不希望短路行为,那么使用按位,以及,您将得到您的预期评估块。

x++ > 2 & ++y > 2 | true仍将计算为true,但x和y的值将分别更改为36

票数 5
EN

Stack Overflow用户

发布于 2013-05-28 05:22:16

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

我明白你现在的真正要求了。您可能想知道,如果&&的优先级最小,那么在最终进入它之前,不会对语句的其余部分进行评估。所以在

代码语言:javascript
复制
x++  >  2  &&   ++y  >  2  |  true 

它应该评估x++ > 2,然后是++y > 2 | true,最后应用&&。好吧,答案是&&采用短路评估。当然,它可以评估一切,然后应用它的效果,这就是按位运算符所做的。但这并不是因为

代码语言:javascript
复制
if (a && b && ...)

应该表现得类似于

代码语言:javascript
复制
if (a) {
   if (b) {
      ...
   }
}

运算符优先级与您预期的一样,但是,由于运算符的属性,计算结果提前终止。所以回到

代码语言:javascript
复制
x++  >  2  &&   ++y  >  2  |  true 

我们看到x++ > 2是假的,因此不计算++y > 2 | true

票数 2
EN

Stack Overflow用户

发布于 2013-05-28 05:22:43

尝尝这个

代码语言:javascript
复制
if(  x++  >  2  &&   ++y  >  2  ||  true    )

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

Operators in java

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/16784386

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档