我正在阅读以下文件,
https://code.google.com/p/go-wiki/wiki/GoForCPPProgrammers
并发现下面的陈述有点模棱两可:
与 C++ 不同,new 是一个函数,而不是一个运算符。new int 是语法错误。
在 C++ 中,我们将运算符实现为函数,例如+
使用operator+
.
那么一般编程语言中运算符与函数的确切区别是什么?
我正在阅读以下文件,
https://code.google.com/p/go-wiki/wiki/GoForCPPProgrammers
并发现下面的陈述有点模棱两可:
与 C++ 不同,new 是一个函数,而不是一个运算符。new int 是语法错误。
在 C++ 中,我们将运算符实现为函数,例如+
使用operator+
.
那么一般编程语言中运算符与函数的确切区别是什么?
函数和运算符之间的实际区别取决于编程语言。在纯 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 视为任何其他函数。
那么一般编程语言中运算符与函数的确切区别是什么?
它很广泛。在抽象语法树中,运算符是一元、二元或有时是三元节点 - 将表达式与某个优先级绑定在一起,例如+
具有低于 的优先级*
,而后者的优先级又低于new
。
函数是一个更抽象的概念。作为原语,它们是类型化的子例程入口点,根据语言可以用作具有词法范围的右值。
C++ 允许通过将运算符评估动态分派给所述方法来使用方法覆盖(重载)运算符。这是一个语言“特性”——正如这个问题的存在所暗示的那样——主要让人们感到困惑,并且在 Go 中不可用。
虽然我仍然认为这个问题基本上是C++ 中运算符和函数之间的差异的重复?,在您引用的特定上下文中,澄清差异的含义可能是值得的。
关键是 C++ 中的函数是具有名称和可能的函数参数的东西,并使用以下语法调用:
func(arg1,arg2,...)
换句话说,首先是名称,然后是圆括号,然后是逗号分隔的参数列表。这是 C++ 的函数调用语法。
而运算符以标准第 5 条所述的方式使用。语法的细节根据运算符的种类而有所不同,例如有像 的一元运算符,像&
的二元运算符+
等*
;还有三元条件运算符? :
,然后是特殊关键字,如new
, delete
, sizeof
,其中一些转换为用户定义类型的函数调用,但它们不使用上述函数调用语法。即你不打电话
new(arg1,arg2,...)
但是,您使用特殊的“一元表达式语法”(第 5.3 节),除其他外,这意味着关键字后面没有圆括号new
(至少,不一定)。
作者在您引用的部分中谈到的正是这种句法差异。
“运算符和函数有什么区别?” 句法。但实际上,这纯粹是关于语言的约定:在 C++ 中,+
是一个中缀运算符(并且只有运算符可以是中缀),并且func()
是一个函数。但即使这并不总是正确的:MyClass::operator+()
它是一个函数,但它可以并且通常使用运算符语法调用。
其他语言有不同的规则:在像 Lisp 这样的语言中,没有真正的区别。可以区分内置函数和用户定义函数,但这种区别有些人为,因为您可以轻松扩展 lisp 以添加额外的内置函数。还有一些语言允许对用户定义的函数使用中缀表示法。像 Python 这样的语言在它们之间映射:lhs
+ rhs
映射到函数调用lhs.__add__( rhs )
(因此“运算符”实际上只是语法糖)。
我总结一下,一般来说编程语言没有规则。只有两个不同的词,每种语言都可以随意使用它们,以最好地描述该语言。
运算符是 C++ 语言语法的一部分,在 C++ 中,如果您不想要默认行为,您可以将它们“重载”为函数,对于复杂类型或用户定义类型,语言可能没有已知运算符的语义,因此 yuser 可以重载它们用他们自己的实现。