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

Evaluation order between a method call and arguments in Java

另一个 SO 问题,我想知道下面的代码是否有未定义的行为:

if (str.equals(str = getAnotherString())) {
  // [...]
}

我倾向于认为调用 equals()str 引用在 进一步的 str 赋值传递为争论。有相关资料吗?

这在JLS Section 15.12.4中明确规定:

At run time, method invocation requires five steps. First, a target reference may be computed. Second, the argument expressions are evaluated. [...]

您问的“目标参考”是什么?这在下一小节中指定:

15.12.4.1. Compute Target Reference (If Necessary)

...

  • If form is ExpressionName . [TypeArguments] Identifier, then:
    • If the invocation mode is static, then there is no target reference. The ExpressionName is evaluated, but the result is then discarded.
    • Otherwise, the target reference is the value denoted by ExpressionName.

所以“目标引用”是 str.equals 中的 str 位 - 您调用方法的表达式。

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

所以是的,你倾向于认为是正确的。但这不是“undefined behaviour”。