从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;。
答案 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
。