Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/jquery-ui/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 表达式的执行优先级_Java - Fatal编程技术网

Java 表达式的执行优先级

Java 表达式的执行优先级,java,Java,在以下代码行中: x = x.times(x).plus(y); 这些表达式将按什么顺序执行 会不会像: x = (x + y)*x 或x=(x^2)+y, 或者别的什么,为什么 关于特定主题的文档链接将受到高度赞赏,因为我在搜索中运气不佳。显然,我不知道去哪里看,找什么 多谢各位 方法链从左到右执行,每个方法使用前一个方法的结果,因此它将是x=(x^2)+y这些是方法;它们被称为“plus”和“times”并不意味着它们必须遵循内置的+和*操作符的行为 因此,将首先执行x.times(x)

在以下代码行中:

x = x.times(x).plus(y);
这些表达式将按什么顺序执行

会不会像:

x = (x + y)*x
x=(x^2)+y
, 或者别的什么,为什么

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


多谢各位

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

这些是方法;它们被称为“plus”和“times”并不意味着它们必须遵循内置的
+
*
操作符的行为

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

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

它将按照从左到右的顺序执行,如下所示

x = (x.times(x)).plus(y)
另一方面:

x = x.(times(x).plus(y))
对我来说都没有意义。你必须把它改写成

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

为了理解它,第二个
x
包含在
times()
中,而
y
在它之外,这一事实排除了这种解释。

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

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

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

某些语言允许创建具有用户提供的优先级的“中缀”函数。(如Haskell:参见“固定性声明”一节)。遗憾的是,Java不是其中之一。

这里有一个很可能包含所需答案的示例(可能是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;
  }
}

难道不是简单地尝试代码就可以回答你的问题吗?不,这只是缺乏关于一个非常基本的主题的知识。。。在阅读了所有的答案后,我通过搜索术语“方法链”也能在互联网上找到信息。我只是不知道正确的术语。我是根据问题给出的两个输出示例,并提供了基于链执行的更可能的输出。非常感谢。您给了我一些非常好的提示,您编写的代码以一种简单但高效且智能的方式为我提供了答案:)+1用于使用
System.out.println()
观察程序的执行情况;这是一个很好的学习技巧。