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