Java运算符优先

时间:2012-12-27 17:23:34

标签: java operators

由于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?什么是真的?

2 个答案:

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