在Java中,为什么后增量比前增量具有更高的优先级?
我了解Java中的后增量和预增量是如何工作的,并且我已经阅读了无数其他人关于这个主题的其他线程/问题。但是我还没有了解为什么在Java中后增量比前增量具有更高的优先级 有人知道吗 据我所知,具有高于或低于预递增优先级的后递增不会影响程序的结果,因为没有其他一元运算符会干扰后递增/预递增。此外,++不是二进制运算符,因此它不会干扰+、-、*、/和%。因此。。为什么?为什么递增后的优先级高于递增前的优先级 我的动机是:Java的出现使得后递增比前递增具有更高的优先级,而且我还没有看到任何根据这些规则得出不同结果的示例。所以我不明白为什么后/前递增没有相同的优先级 如果有人能启发我,我会非常高兴的!:)在Java中,为什么后增量比前增量具有更高的优先级?,java,operators,operator-precedence,Java,Operators,Operator Precedence,我了解Java中的后增量和预增量是如何工作的,并且我已经阅读了无数其他人关于这个主题的其他线程/问题。但是我还没有了解为什么在Java中后增量比前增量具有更高的优先级 有人知道吗 据我所知,具有高于或低于预递增优先级的后递增不会影响程序的结果,因为没有其他一元运算符会干扰后递增/预递增。此外,++不是二进制运算符,因此它不会干扰+、-、*、/和%。因此。。为什么?为什么递增后的优先级高于递增前的优先级 我的动机是:Java的出现使得后递增比前递增具有更高的优先级,而且我还没有看到任何根据这些规则
这里有一个官方网站用Java说明了优先级规则/级别:您需要询问Java设计师,了解他们为什么要进行这种设计调用 但我认为这是以下一种或两种情况:
-
<> LI>只是与C和C++的一致性。
- 这是因为JLS没有直接指定运算符优先级。相反,它是从指定语法的方式中涌现出来的。正如上面所说: “运算符之间的优先级由语法结果的层次结构管理。” 换句话说,决定运算符(etc)优先级的是Java形式语法的结构,而不是某些优先级表。Java语法反映了规范文档的结构
- C++-
- C#-
- 维基百科第页
下面是一个示例,其中运算符优先级会产生明显的差异:
public static volatile a = 42;
public void busywork() {
while (true) {
++aa--; // ... assuming this was valid Java code ....
}
}
现在创建两个线程,一个用于调用busywork
,第二个用于采样a
的值。您应该能够观察a
的不同值集,这取决于相对运算符的优先级;i、 e.{41,42}
与当前规则一致。如果前后递增和递减的优先级相同,那么无论您看到的是{41,42}
还是{42,43}
,都是特定于编译器的
(当然,拥有两个有效的解析树将使编译器规范和编译器实现者的生活更加复杂。)
最后,上面示例中的
++aa--
无效,不管优先级如何,这是毫无价值的。递增/递减运算符需要一个
并计算一个
,并且不能使上述表达式适合任何顺序或优先级的约束
因此,前缀和后缀形式被描述为具有不同的优先级,这一事实对程序员来说没有实际意义
也许Java教程的作者可以“简化”该表中的前优先级组和后优先级组。他们选择不这样做。如果您愿意,您可以通过适当的渠道建议更正。您是否有任何代码可以证明其中一个代码的优先级高于另一个?请接受C的优先级,或者询问James Gosling或Dennis Ritchie。通常由那些想做令人发指的事情的人提出,并提供没有理性的人会写的代码示例。我看到它实际上可以追溯到B,C的前身。@Rohit Jain这里有证据证明,在Java中,后递增实际上比前递增具有更高的优先级(指本表中的第一级和第二级),您至少可以用一个反建议来激发您的WHY吗?有什么让人如此惊讶?他们显然应该有同样的优先权吗?优先级应该是另一种方式吗?只是让您热身一下:
int i=Integer.MAX\u VALUE++我--代码>优先级是否无关?Java中递增前后的相对优先级并不重要。但是,为了提高表示效率,所有前缀运算符(包括预递增)都具有相同的优先级。其中一个是一元负数。现在考虑表达式-x++。它被解析为-(x++),这很有意义。如果优先级相反,它将被解析为(-x)++,这是未定义的,因为-x不是左值(即无法分配给)。如果您想重新打开该问题,请开始重新打开投票。我对该网站的管理不感兴趣。我只是不断看到一些事情被关闭得太过激进,偶尔也会指出这一点。但这与我的答案无关,所以请在meta上发表您的评论。