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)
  • 然后我们将步骤4和5的结果相乘(这是计算的
    *
    运算),(56)
  • 最后,我们将步骤6的结果添加到步骤2(62)的结果中
  • …我们就完蛋了

    TL;DR:优先级和关联性决定了括号的位置,但计算总是从左到右

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


    结合性!=优先。优先级优先,关联性仅用于解决运算符具有相同优先级的情况。我想不出一个例子,说明
    ++
    /
    --
    运算符的关联性很重要,可能没有关联性。太好了!正是我需要的。我将始终使用此树方法计算所有表达式!我还有一个问题,我编辑了这个问题。请看。谢谢你的回答!我还有一个问题,我编辑了这个问题。请看。