为什么Java中的后缀操作符从右到左求值?

为什么Java中的后缀操作符从右到左求值?,java,operator-precedence,Java,Operator Precedence,假设我们有以下Java代码段: int a = 3; int b = a++; a的值首先分配给b,然后递增b=3和a=4。那么为什么后缀表达式要从右向左求值呢?从左到右对其进行评估不是更有意义吗?事实上:不是。这是预期的行为。将a++与+++a进行比较。如果你做最后一个,你会得到a=4,b=4。后缀操作符不是从右到左计算的;它们的副作用发生在确定值之后(粗略地说,JLS指定了顺序)。这里似乎有些混乱。Java总是从左到右求值(或者更准确地说,总是假装这样做),如JLS中所述: Java编程语

假设我们有以下Java代码段:

int a = 3;
int b = a++;

a
的值首先分配给
b
,然后递增<代码>b=3和
a=4
。那么为什么后缀表达式要从右向左求值呢?从左到右对其进行评估不是更有意义吗?

事实上:不是。这是预期的行为。将
a++
+++a
进行比较。如果你做最后一个,你会得到a=4,b=4。

后缀操作符不是从右到左计算的;它们的副作用发生在确定值之后(粗略地说,JLS指定了顺序)。

这里似乎有些混乱。Java总是从左到右求值(或者更准确地说,总是假装这样做),如JLS中所述:

Java编程语言保证 运算符似乎按特定的求值顺序求值, 即从左到右

您所说的是关联性的方向,也就是说,如果一个操作数夹在两个优先级相同的操作之间,那么哪个操作数是绑定到的操作数。例如,三元运算符是右关联的,因为如果你有
a?b?c:d:e
,你希望它解析为
a?(b?c:d):e

但是后缀
++
,与“.”操作符在同一优先级上,是从左到右关联的,这就是
foo.bar++
工作的原因


前缀
++
确实是正确的分组,因为
+++++x
实际上应该是`++(++x)。由于它是一元运算符,且操作数位于右侧,因此必须向右分组。

三元运算符是如何从右向左求值的?当然,对于
a?b:c
来说,评估顺序是
a
,然后是
b
c
,这取决于
a
的值。评估顺序仅适用于有多个项目需要评估的情况。你的例子没有。我正在阅读OCA Java SE 7合作学习指南。本书的第3章明确指出,后缀增量和减量运算符是从右向左计算的。我也验证了这一点,这是关联性,而不是评估顺序。谢谢!这有助于澄清一切。。。对运算符关联性给出了很好的解释。@Prachi不客气,我也试着给出了一个不太好的解释。:)前缀操作符从右向左求值是有意义的。先更新a,然后更新b。但是在后缀操作符中,b在a之前得到更新。所以从左到右阅读更合理。。。至少对我来说是这样。