int i=9;
System.out.println(--i + ++i);
执行输出:17
i 的最终值为:9
但是根据java中的结合性和优先级规则,++i应该首先执行,即从右到左,给出10,然后--i给出9..将两者相加,答案应该是19...至于我知道这样的代码在 C/C++ 中给出了未定义的行为,但在 java 中,规则是严格定义的,并且没有序列点的概念。那么,谁能澄清这个问题,因为我对此感到非常困惑?在一些书中还提到后递增和后递减运算符是 LTR 结合的。但在其他一些书中,所有增量和减量(后和前)都是 RTL 关联的..!谁能给java一个正确的运算符优先级和关联表?
你能指出在哪里Java语言规范它说从右到左的关联性?不是,是左到右(多项分配除外 - 例如x = y = 4
)。参见 JLS 部分15.7.1 http://docs.oracle.com/javase/specs/jls/se7/html/jls-15.html#jls-15.7.1,标题为“首先评估左手操作数”,很有帮助。因此答案是正确的:
--i + ++i
First --i
被评估。这会减少i
(现在是 8)并返回递减后的值 (8)。然后将其添加到++i
这相当于增量并获取(因此 RHS 的计算结果为 9)。
它类似于
AtomicInteger i = new AtomicInteger(9);
i.decrementAndGet() + i.incrementAndGet();
您是否希望对它进行 r-l 评估?
- Java 运算符优先级 http://docs.oracle.com/javase/tutorial/java/nutsandbolts/operators.html
-
好文章 http://www.particle.kth.se/~lindsey/JavaCourse/Book/Part1/Java/Chapter02/operators.html关于结合性和优先级
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)