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

这个问题的代码行为是否可以预期?

为什么这会进入无限循环?

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

§15.7.2运营前评估操作数:

“Java编程语言还保证在执行操作本身的任何部分之前,操作符的每个操作数(除了条件运算符&&,||和?:)之外都会被完全评估。”

=这里是简单分配算子=( §15.26.1 )

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

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

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

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

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