来自(其他问题)的行为是JVM规范中的错误还是预期的?

时间:2010-09-30 19:14:06

标签: java

是否预期会出现此问题的代码行为?

Why does this go into an infinite loop?

1 个答案:

答案 0 :(得分:6)

我很高兴你问,因为很少有人在另一个问题试图解释为什么就是这样(plodoc的回答可能是最接近的)。最重要的部分是:

§15.7.2在操作前评估操作数:

  

“Java编程语言也   保证每个操作数   运算符(条件除外)   运营商&&,||和? :)似乎   在任何部分之前进行全面评估   操作本身就会执行。“

这里的=是简单分配操作员=(§15.26.1

它还保证首先评估左操作数(§15.7.1),但在这种情况下左侧是微不足道的。

这意味着在评估赋值运算符之前必须评估x++。增量将在赋值之前发生,并且由于它是后增量,因此它将计算为x的旧值。

最后,当评估赋值运算符时,“old x”将存储在x中。

重要的是要强调,无论在编译器中做什么,或者看起来多么直观(或没有),所有语言都不能保证这一点。

优先级问题。在C和C ++中,++的优先级高于=。但在这些语言中,在序列点之间修改变量两次是未定义的行为。因此完全兼容的C编译器产生不同的结果。