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

3
Java中运算符和方法的评估规则有什么区别?

8
您的问题在C和Java中都没有意义。 - President James K. Polk
有很多编程语言允许运算符重载(使用方法、函数或者其他方式)。但是C和Java都不支持。例如,C++和Python支持运算符重载。 - extraneon
@Greg:我只是想知道在Java中运算符和方法是如何被评估的。 - unj2
许多运算符可以由编译器映射到简单的机器语言操作,因此编译器直接执行此操作。另一方面,方法通常被编译为对该方法代码的机器语言翻译的调用,除非编译器已将该方法内联。 - Carl Smotricz
@JamesKPolk 但在C#中这是有意义的。我读过《Illustrated CSharp 2012》,在第8章中作者说:“运算符是表示返回单个结果的操作符号”。 - AminM
4个回答

4

操作符可以看作是语法糖,用于

static Foo Plus (Foo right, Foo left)
 {
   // do stuff
   return output;
 }

right + left比写Class.Plus(right, left)更方便。


根本不是这样的,如果您把"+"看作是一个方法,那么它属于哪个类?像"toString()"方法一样,它属于Object类吗? - alex

1

Femaref的回答非常好,我想进一步扩展一下。

运算符(通常)是硬编码到语言中的:像+-*/这样的东西通常会被编译器直接翻译成机器语言(如果这是该语言系统的基本机制),而不需要显式调用库中的方法。例如,在C语言中就是这样的。如果这些运算符没有在语言中定义,你就必须编写plus(2,2)而不是2 + 2

在语言中定义的运算符具有内置优先级的好处。*/通常比+-优先级更高,因此您可以编写3 * 3 + 4 * 4并获得25,而不是没有这种优先级或不同优先级时可能得到的52或84。

当编译器识别运算符但仍将其委托给库时,情况变得有点模糊。FORTRAN中的复数可能是一个例子:通常,编译器不会费心将复杂的操作直接编译成机器代码,而是生成机器代码来调用库。

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

有些语言允许你重载它们的运算符,这样你就可以用一个方法调用来替换运算符通常所做的事情。

大多数语言不允许你定义支持与内置运算符相同机制的自己的运算符。Scala是一个例外;如果你愿意,你可以定义一个+++运算符,并将其连接到你提供的方法。有些人认为运算符重载会使代码更难理解,因此对于这是否是一个好主意,仍存在争议。


0
在C和Java中,您不能为您的类覆盖'+'运算符,因此您的问题对于其他语言是有意义的。
有一些语言可以重载运算符,例如C++和Python。如果您对这样的比较感兴趣,为什么不试试呢?即使您的测试显示'+'运算符比.add()方法慢/快,如果您更改编译器或环境,这可能会改变。
我认为您应该使用看起来适合您的东西。
在Java中,建议使用StringBuffer而不是'+'运算符与String,但最新的Java实现对'+'运算符进行了更好的优化,因此这个建议对于新代码来说并不那么好。

0
我猜你的问题可能是不同的。例如,你可能会问Java在以下两种情况下保证执行bar()baz()的顺序:
foo.bar() + foo.baz()
fee(foo.bar(), foo.baz())

在这两种情况下,bar() 被调用的时间肯定在 baz() 之前(JLS 15.7.1,4)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接