3

我正在阅读以下文件,

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

并发现下面的陈述有点模棱两可:

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

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

那么一般编程语言中运算符函数的确切区别是什么?

4

5 回答 5

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 中的 new 视为任何其他函数。

于 2013-07-22T08:29:04.637 回答
1

那么一般编程语言中运算符与函数的确切区别是什么?

它很广泛。在抽象语法树中,运算符是一元、二元或有时是三元节点 - 将表达式与某个优先级绑定在一起,例如+具有低于 的优先级*,而后者的优先级又低于new

函数是一个更抽象的概念。作为原语,它们是类型化的子例程入口点,根据语言可以用作具有词法范围的右值。

C++ 允许通过将运算符评估动态分派给所述方法来使用方法覆盖(重载)运算符。这是一个语言“特性”——正如这个问题的存在所暗示的那样——主要让人们感到困惑,并且在 Go 中不可用。

于 2013-07-22T09:57:04.807 回答
1

虽然我仍然认为这个问题基本上是C++ 中运算符和函数之间的差异的重复?,在您引用的特定上下文中,澄清差异的含义可能是值得的。

关键是 C++ 中的函数是具有名称和可能的函数参数的东西,并使用以下语法调用:

func(arg1,arg2,...)

换句话说,首先是名称,然后是圆括号,然后是逗号分隔的参数列表。这是 C++ 的函数调用语法。

运算符以标准第 5 条所述的方式使用。语法的细节根据运算符的种类而有所不同,例如有像 的一元运算符,像&的二元运算符+*;还有三元条件运算符? :,然后是特殊关键字,如new, delete, sizeof,其中一些转换为用户定义类型的函数调用,但它们不使用上述函数调用语法。即你不打电话

new(arg1,arg2,...)

但是,您使用特殊的“一元表达式语法”(第 5.3 节),除其他外,这意味着关键字后面没有圆括号new(至少,不一定)。

作者在您引用的部分中谈到的正是这种句法差异。

于 2013-07-22T08:27:24.970 回答
1

“运算符和函数有什么区别?” 句法。但实际上,这纯粹是关于语言的约定:在 C++ 中,+是一个中缀运算符(并且只有运算符可以是中缀),并且func()是一个函数。但即使这并不总是正确的:MyClass::operator+()它是一个函数,但它可以并且通常使用运算符语法调用。

其他语言有不同的规则:在像 Lisp 这样的语言中,没有真正的区别。可以区分内置函数和用户定义函数,但这种区别有些人为,因为您可以轻松扩展 lisp 以添加额外的内置函数。还有一些语言允许对用户定义的函数使用中缀表示法。像 Python 这样的语言在它们之间映射:lhs + rhs映射到函数调用lhs.__add__( rhs )(因此“运算符”实际上只是语法糖)。

我总结一下,一般来说编程语言没有规则。只有两个不同的词,每种语言都可以随意使用它们,以最好地描述该语言。

于 2013-07-22T08:48:01.977 回答
0

运算符是 C++ 语言语法的一部分,在 C++ 中,如果您不想要默认行为,您可以将它们“重载”为函数,对于复杂类型或用户定义类型,语言可能没有已知运算符的语义,因此 yuser 可以重载它们用他们自己的实现。

于 2013-07-22T08:14:12.807 回答