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