Java中运算符和方法的评估规则有什么区别?
操作符可以看作是语法糖,用于
static Foo Plus (Foo right, Foo left)
{
// do stuff
return output;
}
写right + left
比写Class.Plus(right, left)
更方便。
Femaref的回答非常好,我想进一步扩展一下。
运算符(通常)是硬编码到语言中的:像+
、-
、*
和/
这样的东西通常会被编译器直接翻译成机器语言(如果这是该语言系统的基本机制),而不需要显式调用库中的方法。例如,在C语言中就是这样的。如果这些运算符没有在语言中定义,你就必须编写plus(2,2)
而不是2 + 2
。
在语言中定义的运算符具有内置优先级的好处。*
和/
通常比+
和-
优先级更高,因此您可以编写3 * 3 + 4 * 4
并获得25,而不是没有这种优先级或不同优先级时可能得到的52或84。
当编译器识别运算符但仍将其委托给库时,情况变得有点模糊。FORTRAN中的复数可能是一个例子:通常,编译器不会费心将复杂的操作直接编译成机器代码,而是生成机器代码来调用库。
大多数人只考虑算术运算符,比如+
、-
等等。但你也可以将方括号([]
)视为数组索引的运算符。
有些语言允许你重载它们的运算符,这样你就可以用一个方法调用来替换运算符通常所做的事情。
大多数语言不允许你定义支持与内置运算符相同机制的自己的运算符。Scala是一个例外;如果你愿意,你可以定义一个+++
运算符,并将其连接到你提供的方法。有些人认为运算符重载会使代码更难理解,因此对于这是否是一个好主意,仍存在争议。
bar()
和baz()
的顺序:foo.bar() + foo.baz()
fee(foo.bar(), foo.baz())
bar()
被调用的时间肯定在 baz()
之前(JLS 15.7.1,4)。