繁体   English   中英

运算符和方法有什么区别?

[英]What is the difference between an Operator and Method?

运算符的评估规则和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中的复数可能是一个例子:编译器通常不会费心将复杂操作直接编译为机器代码,但会生成机器代码来调用库。

大多数人只考虑算术运算符,如+-等等。 但您也可以考虑使用方括号( [ ] )作为数组索引的运算符。

有些语言允许您重载其运算符,因此您可以将调用替换为操作符通常执行的方法。

大多数语言都不允许您定义自己的运算符,这些运算符支持与内置运算符相同的机制。 斯卡拉是个例外; 如果您愿意,可以定义+++运算符,并将其与您提供的方法连接起来。 有些人认为运营商超载会让代码更难理解,所以陪审团仍然不清楚这是否是一个好主意。

在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)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM