为什么Java中的后缀操作符要从右向左求值?
假设我们有以下Java代码片段:
int a = 3;
int b = a++;
a
的值首先分配给b
,然后递增b = 3
和a = 4
。那么为什么后缀表达式要从右向左求值呢?从左到右进行评估不是更有意义吗
你可以在下面搜索框中键入要查询的问题!
假设我们有以下Java代码片段:
int a = 3;
int b = a++;
a
的值首先分配给b
,然后递增b = 3
和a = 4
。那么为什么后缀表达式要从右向左求值呢?从左到右进行评估不是更有意义吗
# 1 楼答案
这里似乎有些混乱。Java总是从左到右求值(或者更准确地说,总是假装这样做),如JLS here中所述:
你所说的是关联性的方向,也就是说,如果一个操作数夹在两个优先级相同的操作之间,那么哪个操作数是绑定的。例如,三元运算符是右关联的,因为如果你有
a?b?c:d:e
,你希望它解析为a?(b?c:d):e
但是后缀
++
,与“.”处于相同的优先级运算符是从左到右关联的,这就是foo.bar++
工作的原因前缀
++
确实是正确的分组,因为++++x
实际上应该是`++(++x)。由于它是一元运算符,且操作数位于右侧,因此必须向右分组# 2 楼答案
后缀运算符不会从右向左求值;它们的副作用发生在值确定之后(大致说来,JLS指定了顺序)