【问题标题】:Java operators precedenceJava 运算符优先级
【发布时间】: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
  • 可能不是按位或,再检查一次。
  • ||| 不同。一种是按位。另一个是合乎逻辑的。
  • 好的,假名,不是“按位或”而是“非短路或”。
  • 为了更容易理解,即使没有必要,我更喜欢多做一些括号。

标签: java operators


【解决方案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 中定义为 && 较低。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-25
    • 2011-01-09
    • 2011-12-28
    • 1970-01-01
    • 2011-07-07
    相关资源
    最近更新 更多