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”。
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”。