表达式的执行优先级

时间:2011-05-29 13:28:25

标签: java

在以下代码行中:

x = x.times(x).plus(y);

这些表达式将按什么顺序执行?

会是这样的:

x = (x + y)*x

x = (x^2) + y, 或其他什么,为什么?

有关特定主题的文档链接将受到高度赞赏,因为我的搜索没有运气。显然我不知道在哪里寻找和寻找什么。

谢谢。

6 个答案:

答案 0 :(得分:7)

这些是方法;他们被称为“加号”和“时代”这一事实并不意味着他们必须遵循内置+*运营商的行为。

首先执行x.times(x)。这将返回对象的引用,然后将执行plus(y)。然后将其返回值分配给x。它相当于:

tmp = x.times(x);
x = tmp.plus(y);

答案 1 :(得分:2)

这是一个link to a documentation ,最有可能包含所需的答案(可能是15.7)。这是高度技术性和冗长的,但大多数人都无法访问(我相信)。

然而,似乎你刚刚开始编程,所以你最好在这里阅读其他答案,并编程更多以获得直观的感觉(不完全是'感觉',因为它是系统的和严谨的)经营秩序等...

如果您不知道在哪里寻找答案,请不要害怕编写“丢弃”代码(您可以偶然保存代码)以找出您不知道的内容。您可以随时更深入地谷歌搜索,或者在后一天浏览语言规范。你会用这种方式学得更快。 :)

找出一个简单的方法就是写下这样的东西:

class Number{
  private int number;

  public Number(int x){
    number = x;
  }

  public Number times(Number x){
    System.Out.PrintLn("times");
    return number * x;
  }

  public Number plus(Number x){
    System.Out.PrintLn("plus");
    return number + x;
  }
}

答案 2 :(得分:1)

方法链从左到右执行,每个方法都使用前一个方法的结果,因此它将是x = (x^2) + y

答案 3 :(得分:1)

在代数表达式中你所指的是运算符优先级 - 例如,在加法之前评估乘法。 Java编译器知道表达式的这些规则,并将生成代码以按预期评估它们。

对于方法调用,没有“特殊规则”。当给定x = x.times(x).plus(y);时,编译器只知道要评估x.times(x).plus(y),它首先需要知道x是什么,因此它可以在其上调用times。同样,它需要知道x.times(x)是什么,因此它可以在该结果上调用plus方法。因此,这种类型的语句从左到右解析:(x * x)+ y。

某些语言允许创建具有用户提供的优先级的“中缀”功能。 (例如Haskell:参见http://www.haskell.org/tutorial/functions.html,“Fixity声明”部分)。唉,唉,不是其中之一。

答案 4 :(得分:0)

它将以从左到右的顺序执行,如

x = (x.times(x)).plus(y)

另一种方式:

x = x.(times(x).plus(y))

对我来说甚至没有意义。您必须将其重写为

x = x.times(x.plus(y))

理解它,但第二个x包含在times() y而{{1}}位于其外的事实排除了该解释。

答案 5 :(得分:0)

文档没有说明这一点的原因可能是这些表达式遵循如何评估a.b().c().d()之类的语句的正常规则:从左到右。我们从a开始,并在其上调用函数b()。然后,我们就该调用的结果调用c(),并在d()的结果上调用c()。因此,x.times(x).plus(y)将首先执行乘法,然后执行加法。