gpt4 book ai didi

java - 如何解释这个运算符结合性?

转载 作者:塔克拉玛干 更新时间:2023-11-03 04:45:34 31 4
gpt4 key购买 nike

根据 this table , ++ 具有从右到左的结合性。所以,我运行这段代码:

int a = 5;
++a + ++a * ++a

并期望表达式为 50(如 8 + 7 * 6,增量从右到左开始)。但 Eclipse 会从左到右计算表达式 (6 + 7 * 8),并给出 62 的结果。我是 Java 中这种关联性的新手,肯定遗漏了一些明显的东西。请帮助我理解这种奇怪的行为。

编辑:感谢您的回答,但我现在还有一个问题。就是说,从@bizclop 的代码和树答案可以看出,++ 的关联性显然无关紧要。那么,++/-- 的关联性是否有任何用例?

最佳答案

这里混合了两种不同的东西:表达式解析和表达式求值。

让我们从表达式开始:++a+++a *++a。我们首先与它有什么关系?由于运算符 +* 需要两个操作数,而 ++ 需要一个,我们必须弄清楚哪个操作数对应哪个操作。这是表达式解析步骤,其中应用了优先级/关联性。

  1. ++ 具有最高的优先级,因此我们可以将表达式重写为 (++a) + (++a) * (++a)<
  2. 接下来是 *,所以我们可以再次添加括号:(++a) + ((++a) * (++a))
  3. 最后我们有 +,这是所有优先级最低的,因此为了对称起见,我们可以这样写:((++a) + ((++a) * (++a)))

请注意,我们可以将其巧妙地表示为一棵树:

   +
/ \
++ *
| | \
a ++ ++
| |
a a

所以这是我们基于优先级和关联性的评估树。

Note that in this case associativity didn't matter at all as all the operators had different precedence. Had our expression been 4 - 1 - 3 + 2, it would've been important to use associativity to reach (((4 - 1) - 3) + 2), as + and - have the same precedence.

现在是下一步,评估。评估总是从左到右发生(即使是赋值,尽管规则有点古怪),但使用我们刚刚构建的树时它是从左到右发生的。

  1. 因此,首先我们开始评估 + 运算符,因为它位于顶部。
  2. 然后我们向左向下一层,评估 + 运算符左侧的 ++a(6)
  3. 然后我们往右走,开始评估*操作。
  4. 我们这样做的方法是计算第二个++a(7)
  5. 然后是第三个++a (8)
  6. 然后我们将步骤 4 和 5 的结果相乘(这是评估的 * 运算),(56)
  7. 最后我们将第 6 步的结果添加到第 2 步的结果中(62)

...我们完成了。

TL;DR:优先级和结合性决定了放置括号的位置,但求值始终是从左到右的。

15.7. Evaluation Order

The Java programming language guarantees that the operands of operators appear to be evaluated in a specific evaluation order, namely, from left to right.

关于java - 如何解释这个运算符结合性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30911365/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com