由于Java中运算符优先级的原因,我感到很困惑。我很久以前在教程中读到AND的优先级高于OR,这可以通过question中提供的答案得到证实。但是,我目前正在使用“Sun认证的Java 6程序员学习指南”来学习Java。本书包含以下示例:
int y = 5;
int x = 2;
if ((x > 3) && (y < 2) | doStuff()) {
System.out.println("true");
}
我正在复制并引用编译器如何处理上述代码的解释:
If (x > 3)
为true
,(y < 2)
或结果为doStuff()
true
为"true"
,然后打印&&
。因为 短路(y < 2) | doStuff()
,表达式被评估为有 围绕&&
的括号。换句话说,它是 评估为&&
之前的单个表达式和单个表达式|
之后的表达式。
这意味着&&
的优先级高于{{1}}。是不是因为使用了“非短路OR”而不是短路OR?什么是真的?
答案 0 :(得分:8)
那是因为它使用|
运算符而不是||
,它具有更高的优先级。 Here's表格。
使用||
运算符,它会按照您的想法执行。
答案 1 :(得分:0)
由于短路&amp;&amp;,表达式被评估为好像有围绕(y <2)|的括号。 doStuff()......
这种说法不正确,确实毫无意义。事实上&amp;&amp;短路操作符与(y <2)|的评估无关doStuff(),实际上只有在doStuff()返回布尔值时才能编译。差异(隐含的括号)是&amp;&amp;的优先级。相对于|,它在JLS ## 15.22-23中定义为&amp;&amp;低了。