4

由于Java中运算符优先级的正确性,我感到困惑。很久以前,我在教程中读到 AND 的优先级高于 OR,问题中提供的答案证实了这一点。但是,我目前正在使用“Sun Certified Programmer for Java 6 Study Guide”学习 Java。本书包含以下示例:

int y = 5;
int x = 2;
if ((x > 3) && (y < 2) | doStuff()) {
    System.out.println("true");
}

我正在复制并引用编译器如何处理上述代码的解释:

If (x > 3)istrue和is(y < 2)的其中一个或结果 ,然后 print 。由于短路,表达式被评估,就好像在 周围有括号一样。换句话说,它被评估为 之前的单个表达式和 之后的单个表达式。doStuff()true"true"&&(y < 2) | doStuff()&&&&

这意味着尽管 that|具有比 更高的优先级&&。是不是因为使用了“非短路OR”而不是短路OR?什么是真的?

4

2 回答 2

8

那是因为它使用的是|操作符而不是||具有更高优先级的操作符。这是桌子。

改用||运算符,它会按照你的想法做。

于 2012-12-27T17:28:46.177 回答
0

由于短路 &&,表达式的计算就像 (y < 2) | 周围有括号一样。做东西() ...

这种说法是不正确的,确实毫无意义。&& 是短路运算符的事实与 (y < 2) | 的评估无关 doStuff(),实际上只有在 doStuff() 返回布尔值时才能编译。不同之处(隐式括号)是 && 相对于 | 的优先级,在 JLS ##15.22-23 中定义为 && 较低。

于 2012-12-28T09:13:59.000 回答