为什么后期递增的优先级高于Java中的前递增?

时间:2014-01-20 12:59:53

标签: java operators operator-precedence

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

有人知道吗?

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

如果有人能开导我,我会很高兴的! :)

编辑:这是一个官方网站,其中说明了Java中的优先级规则/级别:http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html

EDIT2:对于所有人来说,对于重复的问题,请不要这样做。这是Java,而不是C ++等。我已经搜索过,但没有在Java中找到重复。

EDIT3:我的动机是这样的:Java已被制作成使得后递增具有比预递增更高的优先级,并且我还没有看到根据这些规则结果不同的任何示例。所以我不明白为什么post / pre-incrementing没有相同的优先级

1 个答案:

答案 0 :(得分:1)

您需要让Java设计人员知道他们为什么要进行设计调用。

但我希望它只是为了与C和C ++保持一致。

另见:

对于记录,我认为前缀和后缀运算符具有不同的优先级是至关重要的。如果它们具有相同的优先级,那么像++a++这样的东西有两个替代解析......和两个替代意义。


以下是运算符优先级会产生可观察差异的示例:

 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},它都是编译器特定的

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