Java 如何解释这个操作符的关联性?
根据,Java 如何解释这个操作符的关联性?,java,associativity,Java,Associativity,根据,++具有从右到左的关联性。因此,我运行以下代码: int a = 5; ++a + ++a * ++a 并期望表达式为50(如8+7*6,增量从右向左开始)。但是Eclipse从左到右(6+7*8)计算表达式,结果为62。我对Java中的这种关联性还不熟悉,肯定缺少一些明显的东西。请帮助我理解这种奇怪的行为 编辑:谢谢你的回答,但我现在还有一个问题。从@bizclop的代码和树答案中可以看出,++的关联性显然并不重要。那么,对于+/-的这种关联性是否有任何用例?这是因为乘法运算符*比加法
++
具有从右到左的关联性。因此,我运行以下代码:
int a = 5;
++a + ++a * ++a
并期望表达式为50
(如8+7*6
,增量从右向左开始)。但是Eclipse从左到右(6+7*8
)计算表达式,结果为62
。我对Java中的这种关联性还不熟悉,肯定缺少一些明显的东西。请帮助我理解这种奇怪的行为
编辑:谢谢你的回答,但我现在还有一个问题。从@bizclop的代码和树答案中可以看出,
++
的关联性显然并不重要。那么,对于+
/-
的这种关联性是否有任何用例?这是因为乘法运算符*
比加法运算符具有更高的优先级。
计算将是
++a+(++a*++a)=6+7*8
这里混合了两种不同的东西:表达式解析和表达式求值
让我们从表达式开始:++a+++a*++a
。我们首先要做什么?由于运算符+
和*
需要两个操作数,而+
需要一个操作数,因此我们必须确定哪个操作数与哪个操作相匹配。这是表达式解析步骤,其中应用了优先级/关联性
++
具有最高优先级,因此我们可以将表达式重写为(++a)+(++a)*(++a)
*
,所以我们可以再次添加括号:(++a)+(++a)*(++a))
+
,这是所有代码中优先级最低的,所以为了对称起见,我们可以写:(++a)+(++a)*(++a))
+
/ \
++ *
| | \
a ++ ++
| |
a a
这是基于优先级和关联性的评估树
请注意,在本例中,关联性与所有运算符一样根本不重要
有不同的优先权。如果我们的表达式是4-1-3+2
,那么
使用关联性来达到((4-1)-3)+2)
是很重要的,因为+
和-
具有相同的优先级
现在是下一步,评估。评估总是从左到右进行(即使是作业,虽然规则有点奇怪),但使用我们刚刚构建的树从左到右进行
+
操作符,因为它位于顶部+
操作符左侧的++a
时,我们向左下一级,(6)*
操作++a
,(7)++a
(8)*
运算),(56)结合性!=优先。优先级优先,关联性仅用于解决运算符具有相同优先级的情况。我想不出一个例子,说明
++
/--
运算符的关联性很重要,可能没有关联性。太好了!正是我需要的。我将始终使用此树方法计算所有表达式!我还有一个问题,我编辑了这个问题。请看。谢谢你的回答!我还有一个问题,我编辑了这个问题。请看。