需要帮助理解if语句中的以下布尔表达式

时间:2015-02-24 21:33:52

标签: java short-circuiting operator-precedence

从Kathie Sierra的OCA / OCP Java SE 7程序员I& II学习指南:

int x = 2;
int y = 5;
if ((x > 3) && (y < 2) | doStuff()) {
    System.out.println("true");
}
  

现在打印......什么都没有!因为前面的代码(少了一个   一组括号)评估就像你说的那样,&#34; If(x&gt; 3)   不是真的,并且(y <2)或doStuff()的结果为真,   然后打印真实。因此,如果(x> 3)不是真的,那么看看就没有意义了   其余的表达&#34;因为短路&amp;&amp ;,   评估表达式,好像周围有括号(y&lt;   2)| doStuff()。

根据我的理解,运算符&&||具有相同的优先级,并从左到右进行评估。因此,在这种情况下,仍应首先评估表达式(x > 3) && (y < 2)。请解释一下。

更新:我的错误。这确实是一个&#34; |&#34;而不是&#34; ||&#34;。

1 个答案:

答案 0 :(得分:5)

好吧,我不一定希望它可以打印任何东西。对于给定的x和y值,条件x > 3 && y < 2为false。

我现在有时间思考运算符优先级,基本上,无论doStuff说什么(真或假),如果x > 3计算为false,它都是不打印任何东西。

实际上,这个表达式:

(x > 3) && (y < 2) | doStuff()

相当于:

(x > 3) && (y < 2 | doStuff())

...并且由于x > 3对于给定的x值为false,因此整个表达式的计算结果为false。在这里,&&会使表达式短路,而不会调用doStuff