来自(其他问题)的行为是JVM规范中的错误还是预期的?
这个问题的代码行为是否可以预期?
为什么这会进入无限循环?
我很高兴你问,因为在另一个问题上很少有人试图解释为什么会这样( plodoc的回答可能是最接近的)。 最重要的部分是:
§15.7.2运营前评估操作数:
“Java编程语言还保证在执行操作本身的任何部分之前,操作符的每个操作数(除了条件运算符&&,||和?:)之外都会被完全评估。”
=
这里是简单分配算子=( §15.26.1 )
它还保证首先评估左操作数( §15.7.1 ),但在这种情况下左侧是微不足道的。
这意味着必须在计算赋值运算符之前评估x++
。 增量将在赋值之前发生,并且由于它是后递增的,因此它将计算为x
的旧值。
最后,当评估赋值运算符时,“旧x”将存储在x中。
重要的是要强调,无论在编译器中做什么,或者看起来(或不是)看起来多么直观,所有语言都无法保证这一点。
这也不是优先权问题。 ++
在C和C ++中的优先级高于=
。 但在这些语言中,在序列点之间修改变量两次是未定义的行为。 因此完全兼容的C编译器产生不同的结果。