我一直在学习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都被评估.....
答案 0 :(得分:2)
&&
运算符在||
之前处理,但操作数在任何运算符处理之前都会被计算。
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
甚至没有评估达到此结果。