对于AND OR运算符优先级,Java规范是否已更改?

时间:2014-06-11 21:59:42

标签: java operator-keyword specifications operator-precedence

我一直在学习Oracle java认证考试。

今天我遇到一个问题,询问表达式的哪一部分进行评估。

它像 a()|| b()&& C()。

到目前为止一切似乎都没问题。 &安培;&安培;运算符优先级的优先级高于||运算符,它首先评估,然后是||运营商评估。

当我尝试在我的Windows 7 / java 7机器上运行类似的代码时出现问题。当我运行我的代码时||首先是运营商的evalautes。我检查了几本书,我研究的那本书(manning java associate。)反之亦然。你觉得什么错了?

这是我可以检查的代码

public class Dummy {


public static  void main(String[] arg) {

boolean ax = method1() ||  method2()  &&  method3() ;

}

public static boolean method1(){

System.err.println("method1");

return false;
}

public static boolean method2(){

System.err.println("method2");
return false;
}

public static boolean method3(){
System.err.println("method3");
return true;
}

}

编辑:我得到的是输出:method1,方法2 我期待的是:method2,method1

编辑2:这就是本书所说的(管理OCA java Se 7程序员1证书指南)第507页

表达式(a> = 99 || a< = 33&& b == 10)有三个操作数和 OR(||)和AND(&&&)短路运算符。

由于短路运算符AND的运算符优先级高于短路运算符OR,因此表达式的计算结果如下: (a&gt; = 99 ||(a <= 33&amp;&amp; b == 10)) 对前述表达式的评估从(a&lt; =&lt; =&amp;&amp; b == 10)的评估开始。

因为&lt; = 33评估为真,所以运营商&amp;&amp;计算第二个操作数(b == 10) 确定(a&lt; =&lt; =&amp;&amp; b == 10)是否将返回true或false。 a&lt; = 33返回true 并且b == 10返回false,因此表达式(a&lt; =&lt; =&amp; b == 10)返回false。 原始表达式 - (a> = 99 ||(a <= 33&amp;&amp; b == 10))现在减少到 以下表达式: (a> = 99 || false)

短路运算符OR(||)执行其第一个操作数(即使该值为 第二个操作数是已知的,评估a> = 99.所以对于这个表达式,所有三个oper-ands都被评估.....

2 个答案:

答案 0 :(得分:2)

&&运算符在||之前处理,但操作数在任何运算符处理之前都会被计算。

Section 15.7.2 of the JLS州:

  

Java编程语言保证在执行操作本身的任何部分之前,操作符的每个操作数(条件运算符&amp;&amp;,||和?:)除外似乎都要完全评估。

因此,在method1()method2()运作之前评估||&&&&短路,因此不会调用method3()。然后&&运行,产生false,然后||运行,产生false

打印出来:

method1
method2

答案 1 :(得分:1)

不,你只是感到困惑。

他们就是这样执行的。

method1() || (method2() && method3());

你的method1返回false,它首先被评估(因为我们在这里左右)。然后评估method2并返回false。最后评估method3,整个&amp;&amp;&amp;和/或众所周知是假的。最后,假|| false表示错误。这是最终结果,method3甚至没有评估达到此结果。