Java中运算符和方法的评估规则有什么区别?
4 回答
运算符可以看作是语法糖
static Foo Plus (Foo right, Foo left)
{
// do stuff
return output;
}
它只是更方便地编写right + left
而不是Class.Plus(right, left)
.
Femaref 的回答非常好;我想扩展它。
运算符(通常)被硬连接到语言中:诸如+
, -
,之类的*
东西/
通常由编译器直接翻译成机器语言(如果这是该语言系统的底层机制),而无需显式调用库中的方法。例如,这就是它在 C 中的样子。如果这些运算符未在语言中定义,则您必须编写代码plus(2,2)
而不是2 + 2
.
该语言中定义的运算符具有内置优先级的好处。*
并且/
通常具有比+
and更高的优先级-
,因此您可以编写3 * 3 + 4 * 4
并获得 25,而不是在没有此类优先级或不同优先级的情况下获得的 52 或 84。
当运算符被编译器识别但仍被委托给库时,这条线会变得有点灰色。FORTRAN 中的复数可能就是一个例子:通常编译器不会费心将复杂的操作直接编译成机器代码,而是会生成机器代码来调用库。
大多数人只会想到算术运算符,例如+
等-
。但是,例如,您也可以考虑将方括号 ( [ ]
) 作为数组索引的运算符。
某些语言允许您重载它们的运算符,因此您可以用对方法的调用来代替运算符通常所做的任何事情。
大多数语言不允许您定义自己的运算符来支持与内置运算符相同的机制。Scala 在这里是个例外。如果您愿意,您可以定义一个+++
运算符并将其连接到您提供的方法。有些人认为运算符重载会使代码更难理解,所以对于这是否是一个好主意还没有定论。
在 C 和 Java 中,您不能为您的类覆盖“+”运算符,因此您的问题对其他语言有意义。
有些语言可以覆盖运算符,例如 C++ 和 Python。如果您对这样的比较感兴趣,为什么不尝试呢?即使您的测试表明 '+' 运算符比 .add() 方法更慢/更快,如果您更改编译器或环境,这可能会改变。
我认为你应该使用看起来对你有好处的东西。
Java 中有一些建议可以使用操作符StringBuffer
代替+
操作符,String
但最新的 Java 实现可以更好地优化+
操作符,因此该建议对新代码不是那么好。
我会根据你的要求做出不同的猜测。例如,您可能会问,Java 保证在以下两种情况下执行bar()
的顺序是什么:baz()
foo.bar() + foo.baz()
fee(foo.bar(), foo.baz())
在这两种情况下,bar()
肯定会在之前调用baz()
(JLS 15.7.1,4)