![](/img/trans.png)
[英]Is Java evaluation order guaranteed in this case of method call and arguments passed in
[英]Evaluation order between a method call and arguments in Java
处理另一个 SO 问题,我想知道下面的代码是否有未定义的行为:
if (str.equals(str = getAnotherString())) {
// [...]
}
我倾向于认为发出equals()
调用的str
引用是在作为参数传递的进一步str
赋值之前评估的。 有消息来源吗?
这在JLS 第 15.12.4 节中有明确规定:
在运行时,方法调用需要五个步骤。 首先,可以计算目标参考。 其次,评估参数表达式。 [...]
你问什么是“目标参考”? 这在下一小节中指定:
15.12.4.1。 计算目标参考(如有必要)
...
- 如果表单是 ExpressionName 。 [TypeArguments] 标识符,然后:
- 如果调用模式是静态的,则没有目标引用。 ExpressionName 被评估,但结果随后被丢弃。
- 否则,目标引用是由 ExpressionName 表示的值。
所以“目标引用”是str.equals
的str
位 - 您正在调用该方法的表达式。
正如第一个引用所说,首先评估目标引用,然后是参数。 因此, str.equals(str = getAnotherString())
仅当getAnotherString
返回的字符串与赋值表达式之前的str
具有相同字符时才计算为真。
所以是的,你倾向于认为是正确的。 但这不是“未定义的行为”。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.