java中( - i + ++ i)中表达式的输出

Dea*_*hew 3 java operator-precedence associativity

int i=9;
System.out.println(--i + ++i);
Run Code Online (Sandbox Code Playgroud)

执行时的输出:17
i的最终值是:9

但是根据java中的关联性和优先级规则,我应该首先执行,即从右到左执行10,然后--i给出9 ..添加两者,答案应该是19 ...至于我知道这样的代码在C/C++中给出了未定义的行为,但在java中,规则是严格定义的,并且没有序列点的概念.所以,任何人都可以澄清问题,因为我真的很困惑这个?还有一些书中提到后增量和后减量运算符是LTR关联的.但是在其他一些书中,它给出了所有增量和减量(post和pre)都是RTL关联的.!! 任何人都可以为java提供正确的运算符优先级和关联表吗?

oxb*_*kes 9

你能指出它在Java语言规范中从哪里说出从右到左的关联性?它不是,它是从左到右(除了多个分配 - 例如x = y = 4).参见JLS第15.7.1节,标题为"首先评估左手操作数".因此答案是正确的:

--i + ++i
Run Code Online (Sandbox Code Playgroud)

首先--i进行评估.此递减i(现在为8)并返回后递减值(8).然后将++i其添加到等效于increment-and-get(因此RHS评估为9).

它类似于

AtomicInteger i = new AtomicInteger(9);
i.decrementAndGet() + i.incrementAndGet();
Run Code Online (Sandbox Code Playgroud)

你还期望这个也被评估吗?

  • 添加了直接JLS引文. (2认同)