Java中表达式(--i + ++i)的输出结果是什么?

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

执行输出:17 i的最终值为:9
根据Java中的结合性和优先级规则,应首先执行++i,即从右到左计算得10,然后--i得到9...将两者相加,答案应该是19...就我所知,这种代码在C / C ++中会产生未定义的行为,但在Java中,规则是严格定义的,并且没有序列点的概念。那么,是否有人可以澄清这个问题?因为我确实对此感到困惑。此外,在某些书籍中提到后置递增和后置递减运算符是LTR关联的。但在其他一些书籍中,所有递增和递减(包括后置和前置)都是RTL关联的。是否有人可以为Java提供正确的运算符优先级和关联表?

8个回答

10
你能指出在Java语言规范的哪里说结合性是从右到左吗?事实上不是,它是从左到右(除了多重赋值-例如x = y = 4)。请参见JLS第15.7.1节,标题为“首先评估左操作数”。因此答案是正确的:
--i + ++i

首先评估--i,这会将i减1(现在i为8),然后返回后减量值(8)。然后将此值与++i相加,等同于增量获取值(因此RHS的计算结果为9)。

这类似于:

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

你是否期望这个表达式也是从右到左计算的?


他可能混淆了中缀运算符+和前置自增++的结合性。这本书(http://introcs.cs.princeton.edu/java/11precedence/)指出,前置自增++是从右到左的。 - nhahtdh

2

表达式的计算从左到右进行。

(--i + ++i)

--i = 8 //i becames 8 here
++i = 9 // i becames 9 here again
8+9 = 17 

1

评估从左到右进行。执行 --i 变成 8,执行 ++i 得出 9,然后进行加法运算得出 17。


这个问题已经被回答和解释过了,那么你再次提出的意图是什么? - Tom

1

首先--i变成8,然后++i变成9。所以答案是17。

int i =9;

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

so finally (8+9)=17 and i=9.

0

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

我们知道,递增和递减的优先级高于算术运算符“+”,因此'++'和'--'首先被计算。现在一元运算符的结合性是从右到左的,因此根据这个规则,应该首先计算'++'运算符。但在评估之前,还有另一个绑定概念,因此它将表达式绑定为((--i)+(++i)),然后根据()运算符,其结合性是从左到右的,它将首先计算(--i),然后计算(8+(++i))i=8。 现在它将评估(++i),然后(8+9)i=9,因此最终答案将是(8+9)=17


0
输出正确:
首先,--i 先被执行,所以 i 变成 8,然后 ++i 被执行。现在,i 是 8,所以++i 变成 9,然后中间的 + 会变成 8 + 9 = 17。
Java 的结合性是从左到右的。

0

(--i + ++i)

从左到右开始评估。

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

8 + 9 = 17

-1

表达式求值从左到右进行

i=9;
First --i than i=9-1, i=8
After ++i than i=8+1, i=9
--i + ++i  = 17

这个问题已经被回答和解释过了,那么你再次提出的意图是什么? - Tom

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接