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