3
int i=9;
System.out.println(--i + ++i);

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

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

4

8 回答 8

10

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

--i + ++i

首先--i是评估。此递减i(现在为 8)并返回递减后的值 (8)。然后将++i其添加到相当于增量和获取的值(因此 RHS 评估为 9)。

它类似于

AtomicInteger i = new AtomicInteger(9);
i.decrementAndGet() + i.incrementAndGet();

您是否希望这也被评估 rl ?

于 2012-05-30T08:39:36.687 回答
2

表达式评估从左到右

(--i + ++i)

--i = 8 //i becames 8 here
++i = 9 // i becames 9 here again
8+9 = 17 
于 2012-05-30T08:40:17.517 回答
1

首先 --i 变成 8 然后 ++i 变​​成 9.so answr 是 17。

int i =9;

--i =8, now i is 8
++i=9 ,++ makes 9

so finally (8+9)=17 and i=9.
于 2012-05-30T08:39:24.130 回答
1

评估从左到右开始。Do --iwhich 变成 8,++iwhich 计算结果为 9,加法完成,得到 17。

于 2017-02-05T12:04:19.927 回答
0

输出是正确的:

首先,先--i被执行,所以i变成8then++i被执行。现在,i8变成++9,然后中间+变成了8 + 9 = 17

Java 执行从左到右的关联性。

于 2012-05-30T08:41:42.440 回答
0

(--i + ++i)

评估从左到右开始。

first    (
second --i   // 8
third    +   // addition operator
fourth ++i   // 9
fifth    )

8 + 9 = 17
于 2012-05-30T08:45:44.627 回答
0

int i=9; System.out.println(--i + ++i);

众所周知,递增和递减的优先级高于算术运算符'+',因此首先评估'++'和'--'。现在一元运算符的关联性是从右到左的,因此根据此它应该首先评估'++'运算符。但是在求值之前,还有一个绑定的概念,所以,它会绑定表达式 as ((--i)+(++i))和 now 根据 () 运算符,它的关联性是从左到右的,它会先求值(--i),然后再(8+ (++i))求值i=8。现在它将评估 (++i) 然后(8+9)i=9,所以最终答案将是(8+9) = 17

于 2016-06-13T04:07:25.923 回答
-1

表达式评估从左到右

i=9;
First --i than i=9-1, i=8
After ++i than i=8+1, i=9
--i + ++i  = 17
于 2017-02-05T14:20:04.970 回答