我正在阅读以下文件,
https://code.google.com/p/go-wiki/wiki/GoForCPPProgrammers
并发现下面的陈述有点含糊不清:
与C ++不同,new是一个函数,而不是一个运算符; new int是语法错误。
在C ++中,我们将运算符实现为函数,例如+
使用operator+
。
那么编程语言中 operator 与 function 的确切区别是什么?
答案 0 :(得分:2)
函数和运算符之间的实际区别取决于编程语言。在简单的C中,运算符是语言本身的一部分。无法添加运算符,也无法更改现有运算符的行为。 C ++并非如此,其中运算符被解析为函数。
从完全不同的角度来看,考虑Haskell,其中任何(二元)函数可以被视为二元运算符:
如果你不说Haskell,但了解点产品,这个例子仍然应该是相当简单的。给出:
dotP :: (Double, Double) -> (Double, Double) -> Double
dotP (x1, y1) (x2, y2) = x1 * x2 + y1 * y2
两个
dotP (1,2) (3,4)
和
(1,2) `dotP` (3,4)
将给出11。
要解决Go文档中的引用:Go开发人员只是强调在C ++中,人们会将new视为具有自己语法的关键字,应该将Go视为任何其他函数。
答案 1 :(得分:1)
虽然我仍然认为这个问题基本上与Difference between operator and function in C++?重复,但可能值得澄清一下你引用的特定背景中差异的含义。
关键在于C ++中的函数具有名称和可能的函数参数,并使用以下语法调用:
func(arg1,arg2,...)
换句话说,首先是名称,然后是圆括号,然后是以逗号分隔的参数列表。这是C ++的函数调用语法。
而运算符以本标准第5条所述的方式使用。语法的细节根据操作符的类型而变化,例如,有&
等一元运算符,+
,*
等二元运算符;还有三元条件运算符? :
,然后有一些特殊的关键字,如new
,delete
,sizeof
,其中一些翻译到函数调用用户定义的类型,但它们不使用上述的函数调用语法。即你不打电话
new(arg1,arg2,...)
但相反,你使用一种特殊的“一元表达式语法”(§5.3),这意味着,在关键字new
之后不存在圆括号(至少不是)一定)。
这是语法的区别,作者在你引用的部分中谈到了这一点。
答案 2 :(得分:1)
“运营商和职能有什么区别?”
句法。但事实上,这纯粹是一个关于的公约
语言:在C ++中,+
是一个中缀运算符(仅限于
运算符可以是中缀),func()
将是一个函数。但
即使这并非总是如此:MyClass::operator+()
是
一个函数,但它可以,并且通常使用
运算符语法。
其他语言有不同的规则:在像Lisp这样的语言中,
没有真正的区别。人们可以区分
内置函数与用户定义函数,但是
区别有点人为,因为你很容易
扩展lisp以添加其他内置函数。还有
允许对用户定义使用中缀表示法的语言
功能。像Python这样的语言在它们之间映射:lhs
+ rhs
映射到函数调用lhs.__add__( rhs )
(所以
“操作员”实际上只是语法糖。
总之,一般来说编程语言没有规则。 只有两个不同的单词,每种语言都是 随意使用它们,以便最好地描述语言。
答案 3 :(得分:1)
那么一般来说编程语言中运算符与函数的确切区别是什么?
它很广泛。在抽象语法树中,运算符是一元,二元或有时是三元节点 - 将表达式与特定优先级绑定在一起,例如: +
的优先级低于*
,后者的优先级低于new
。
功能是一个更抽象的概念。作为原语,它们是类型化的子例程入口点,根据语言可以用作具有词法范围的rvalues。
C ++允许通过动态地将运算符评估分配给所述方法来使用方法覆盖(重载)运算符。这是一种语言“特征” - 正如这个问题的存在所暗示的那样 - 大多数人混淆并且在Go中不可用。
答案 4 :(得分:0)
运算符是c ++语言语法的一部分,在C ++中,如果你不想要默认行为,你可以将它们“重载”为函数。对于复杂类型或用户定义的类型,语言可能没有运算符的语义,所以yuser可以使用自己的实现重载它们。