Java 运算符优先级

Posted

技术标签:

【中文标题】Java 运算符优先级【英文标题】:Java operators precedence 【发布时间】:2012-12-13 01:49:15 【问题描述】:

由于 Java 中运算符优先级的正确性,我感到困惑。我很久以前在教程中读到 AND 的优先级高于 OR,question 中提供的答案证实了这一点。但是,我目前正在使用“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 &gt; 3)true,并且要么是 (y &lt; 2),要么是 doStuff()true,然后打印"true"。由于 短路&amp;&amp;,表达式被评估,好像有 (y &lt; 2) | doStuff() 周围的括号。换句话说,它是 在 &amp;&amp; 和单个表达式之前评估为单个表达式 &amp;&amp; 之后的表达式。

这意味着| 的优先级高于&amp;&amp;。是不是因为使用了“非短路OR”而不是短路OR?什么是真的?

【问题讨论】:

可能是书中的印刷错误。按位或 b/w (y&lt;2)doStuff() 没有意义。此外,解释说“要么 y 可能不是按位或,再检查一次。 ||| 不同。一种是按位。另一个是合乎逻辑的。 好的,假名,不是“按位或”而是“非短路或”。 为了更容易理解,即使没有必要,我更喜欢多做一些括号。 【参考方案1】:

那是因为它使用| 运算符而不是||,后者具有更高的优先级。 Here's桌子。

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

【讨论】:

也就是说,书上的解释是完全错误的。 &amp;&amp; 运算符的短路与为什么 (y &lt; 2) | doStuff() 被评估为好像它周围有括号一样。 @JB Nizet:该示例设置的是运算符优先级,而不是 && 的实际工作方式。令人惊讶的是,这本书缺少一个表格来展示本节中运算符的全部优先级,因此根据我以前的知识让我感到困惑。 是的,我同意这是一个愚蠢的例子。底线是运算符优先级表告诉所有 @arjacsoh:我的意思是这句话是错误的:由于短路&&,表达式被评估,就好像(y .实际上应该是: 因为 |具有比 && 更高的优先级,则表达式被评估为好像 (y . 很难看到它是如何编译的 - 布尔值 (y &lt; 2) 会自动提升为 int 吗?【参考方案2】:

由于 && 短路,表达式的计算就像 (y

这种说法是错误的,确实毫无意义。 && 是短路运算符的事实与 (y 优先级,在 JLS ##15.22-23 中定义为 && 较低。

【讨论】:

以上是关于Java 运算符优先级的主要内容,如果未能解决你的问题,请参考以下文章

Java运算符优先级谁知道?

java中位运算符的优先级

在java运算符&&,,==,+中优先级最高的是

java运算优先级的问题

Java 运算符优先级

Java运算符的优先级与结合性是怎样的?