繁体   English   中英

Java中方法调用和参数之间的求值顺序

[英]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.equalsstr位 - 您正在调用该方法的表达式。

正如第一个引用所说,首先评估目标引用,然后是参数。 因此, str.equals(str = getAnotherString())仅当getAnotherString返回的字符串与赋值表达式之前的str具有相同字符时才计算为真。

所以是的,你倾向于认为是正确的。 但这不是“未定义的行为”。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM