代码之家  ›  专栏  ›  技术社区  ›  Amessihel

Java中方法调用和参数的运算符优先级

  •  1
  • Amessihel  · 技术社区  · 5 年前

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

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

    我倾向于认为 str 从中引用 equals() 呼叫被评估 之前 更远的 str公司 作为参数传递的赋值。有消息来源吗?

    1 回复  |  直到 5 年前
        1
  •  2
  •   Sweeper    5 年前

    这在 JLS Section 15.12.4 :

    在运行时,方法调用需要五个步骤。首先,可以计算目标参考。其次,对参数表达式求值。[...]

    你问的“目标参考”是什么?这在下一小节中有详细说明:

    15.12.4.1条。计算目标引用(如有必要)

    ...

    • 如果表单是ExpressionName。[TypeArguments]标识符,然后:
      • 如果调用模式是静态的,则没有目标引用。将计算表达式名称,但结果将被丢弃。
      • 否则,目标引用就是ExpressionName表示的值。

    所以“目标参考”是 str 咬入 str.equals -调用方法的表达式。

    正如第一句话所说,首先评估目标引用, 然后 争论。因此, str.equals(str = getAnotherString()) 只有当 getAnotherString 返回与具有相同字符的字符串 str公司 在赋值表达式之前。

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