【问题标题】:WHY does post incrementing have higher precedence than pre incrementing in Java? [duplicate]为什么在 Java 中后递增的优先级高于预递增? [复制]
【发布时间】:2014-01-20 12:59:52
【问题描述】:

我了解 Java 中的后自增和预自增是如何工作的,并且我已经阅读了其他人关于同一主题的无数其他线程/问题。但!我还没有了解为什么在 Java 中后递增比预递增具有更高的优先级。

有人知道吗?

据我所知,后递增的优先级高于或低于前递增不会影响程序的结果,因为没有其他一元运算符会干扰后递增/预递增。此外,++ 不是二元运算符,因此它不会干扰 +、-、*、/ 和 %。因此.. 为什么?为什么后自增的优先级高于前自增?

我的动机是这样的:Java 的设计使得后增量比前增量具有更高的优先级,而且我还没有看到任何结果因这些规则而异的示例。所以我不明白为什么 post/pre-incrementing 没有相同级别的优先级

如果有人能启发我,我会很高兴! :)

这是一个声明 Java 优先规则/级别的官方网站:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

【问题讨论】:

  • 您是否有任何代码可以证明其中一个优先级高于另一个?
  • 要么接受 C 的优先级,要么去询问 James Gosling 或 Dennis Ritchie。通常是那些想要做令人发指的事情并提供任何理性人都不会编写的代码示例的人提出的。我看到它实际上可以追溯到 C 的前身 B。
  • @Rohit Jain 这里证明了在 Java 中后自增确实比预自增具有更高的优先级(指本表中的第 1 级和第 2 级)docs.oracle.com/javase/tutorial/java/nutsandbolts/…
  • 你至少能用反建议来激发你的 WHY 吗?有什么好惊讶的?他们应该有 same 优先级是不是很明显?优先级应该反过来吗?
  • 只是为了温暖你:int i = Integer.MAX_VALUE; ++i--; 优先级无关吗?

标签: java operators operator-precedence


【解决方案1】:

您需要询问 Java 设计人员,了解他们进行设计调用的原因。

但我希望它是以下一种或两种:

  • 只是为了与 C 和 C++ 保持一致。
  • 这是因为 JLS 没有直接指定运算符优先级。相反,它是从指定语法的方式中出现的。正如JLS 15.2 所说:

    “运算符之间的优先级由语法产生式的层次结构管理。”

    换句话说,决定运算符(等)优先级的是 Java 形式语法的结构,而不是某些优先级表。 Java 语法反映了规范文档的结构。

您在问题中链接到的“官方网站”实际上是 Oracle Java 教程的一部分。它是次要来源。 JLS 优先。

另见:


这是一个运算符优先级会产生明显差异的示例:

 public static volatile a = 42;

 public void busywork() {
    while (true) {
       ++aa--;   // ... assuming this was valid Java code ....
    }
 }

现在创建 2 个线程,一个调用 busywork,第二个对 a 的值进行采样。您应该能够观察到 a 的不同值集,具体取决于相对运算符优先级;即{41, 42} 与当前规则。如果 post 和 pre-increment 和 decrement 的优先级相同,那么无论您看到 {41, 42} 还是 {42, 43},它都是特定于编译器的

(当然,拥有两个有效的解析树会使编译器规范和编译器实现者的生活变得更加复杂。)


最后,上面例子中的++aa--不管优先级如何都是无效的。递增/递减运算符需要 <lvalue> 并计算 <rvalue>,并且您不能使上述表达式适合 任何 排序或优先级的约束。

因此,前缀和后缀形式被描述为具有不同的优先级这一事实对程序员没有实际差异。

也许 Java 教程的作者可以将前后优先组“简化”为该(非确定性)表中的一组。他们选择不这样做。如果您愿意,可以通过适当的渠道提出更正建议。

【讨论】:

  • Java 中前置和后置递增的相对优先级无关紧要。但是,为了表示的效率,所有前缀运算符,包括预递增,都具有相同的优先级。其中之一是一元减号。现在考虑表达式 - x++。它被解析为 - (x++),这是有道理的。以相反的优先级,它将被解析为 (-x)++,这是未定义的,因为 -x 不是左值(即不能分配给)。跨度>
  • 如果您想重新提出问题,请重新开始投票。
  • 我对本网站的管理不感兴趣。我只是不断地看到那些过于激进地关闭的东西,偶尔会指出这一点。
  • 注明。但这与我的答案无关,因此请在meta上制作您的cmets。
猜你喜欢
  • 2017-07-18
  • 2013-06-18
  • 2020-11-01
  • 1970-01-01
  • 2013-06-18
  • 1970-01-01
  • 2019-12-06
  • 1970-01-01
  • 2014-06-14
相关资源
最近更新 更多