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()
观察程序的执行情况;这是一个很好的学习技巧。