java中( – i + ++ i)中表达式的输出
int i=9; System.out.println(--i + ++i);
执行时输出:17
i的最终值是:9
但根据java中的关联性和优先级规则,我应该首先执行,即从右到左执行10然后–i给出9 ..添加两者,答案应该是19 …至于我知道这样的代码在C / C ++中给出了未定义的行为,但在java中,规则是严格定义的,并且没有序列点的概念。 所以,任何人都可以澄清问题,因为我真的很困惑这个? 在一些书中也提到了后增量和后减量运算符是LTR关联的。 但是在其他一些书中,它给出了所有增量和减量(post和pre)都是RTL关联的。!! 任何人都可以为java提供正确的运算符优先级和关联表吗?
你能指出它在Java语言规范中从哪里说出从右到左的关联性? 它不是,它从左到右 (除了多个分配 – 例如x = y = 4
)。 参见JLS第15.7.1节,标题为“首先评估左手操作数”。 因此答案是正确的:
--i + ++i
首先评估--i
。 这递减i
(现在是8)并返回后递减值(8)。 然后将其添加到++i
,它相当于increment-and-get(因此RHS的计算结果为9)。
它类似于
AtomicInteger i = new AtomicInteger(9); i.decrementAndGet() + i.incrementAndGet();
您是否也期望对此进行评估?
- Java运算符优先级
- 关于关联性和优先性的好文章
表达评估从左到右
(--i + ++i) --i = 8 //i becames 8 here ++i = 9 // i becames 9 here again 8+9 = 17
首先 – 我变成8然后++我变成9.所以答案是17。
int i =9; --i =8, now i is 8 ++i=9 ,++ makes 9 so finally (8+9)=17 and i=9.
评估从左到右开始。 变成8的~ ++i
和评价为9的++i
以及赋予17的加法。
输出是正确的:
首先, – i
首先执行,所以i
变为8
然后执行++i
。 现在, i
是8
所以++
我变成9
,然后是中间+
变成8 + 9 = 17
。
Java从左到右进行关联。
( – i + ++ i)
评估从左到右开始。
first ( second --i // 8 third + // addition operator fourth ++i // 9 fifth ) 8 + 9 = 17
int i=9; System.out.println(--i + ++i);
我们知道,增量和减量的优先级高于算术运算符’+’,因此首先计算’++’和’ – ‘。 现在,一元运算符的关联性是从右到左,所以根据它,它应该首先评估’++’运算符。 但在评估之前,还有另一个绑定概念,它将表达式绑定为((--i)+(++i))
,现在根据()运算符,其关联性从左到右,它将评估首先(--i)
然后(8+ (++i))
和i=8
。 现在它将评估(++ i)然后(8+9)
和i=9
,所以最后答案将是(8+9) = 17
。
表达评估从左到右
i=9; First --i than i=9-1, i=8 After ++i than i=8+1, i=9 --i + ++i = 17