运算符与函数行为

时间:2013-07-22 08:06:24

标签: c++ syntax go operator-overloading new-operator

我正在阅读以下文件,

https://code.google.com/p/go-wiki/wiki/GoForCPPProgrammers

并发现下面的陈述有点含糊不清:

  

与C ++不同,new是一个函数,而不是一个运算符; new int是语法错误。

在C ++中,我们将运算符实现为函数,例如+使用operator+

那么编程语言中 operator function 的确切区别是什么?

5 个答案:

答案 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条所述的方式使用。语法的细节根据操作符的类型而变化,例如,有&等一元运算符,+*等二元运算符;还有三元条件运算符? :,然后有一些特殊的关键字,如newdeletesizeof,其中一些翻译到函数调用用户定义的类型,但它们不使用上述的函数调用语法。即你不打电话

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可以使用自己的实现重载它们。