Mat*_*hen 6

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

§15.7.2运营前评估操作数:

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

=这里简单赋值运算符=(§15.26.1)

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

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

最后,当评估赋值运算符时,"旧x"将存储在x中.

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

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