C++ 运算符与函数行为

C++ 运算符与函数行为,c++,syntax,go,operator-overloading,new-operator,C++,Syntax,Go,Operator Overloading,New Operator,我正在阅读以下文件 发现下面的陈述有点模棱两可: 与C++不同,新是函数,不是算子;newint是一个语法错误 在C++中,我们使用运算符作为函数,例如 +/>代码>使用代码>操作符+ < /代码> .< 强> >在编程语言中,操作符与函数的确切区别是什么?< /强> < P>运算符是C++语言语法的一部分,C++中,你可能会将它们作为函数来重载,如果你不想要默认行为,对于复杂类型或用户定义的类型,语言可能不具有操作符的语义,因此,yuser可以用自己的实现让它们负担过重。虽然我仍然认为这个

我正在阅读以下文件

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

<>与C++不同,新是函数,不是算子;newint是一个语法错误

在C++中,我们使用运算符作为函数,例如<代码> +/>代码>使用代码>操作符+ < /代码> .<
<>强> >在编程语言中,操作符与函数的确切区别是什么?< /强>

< P>运算符是C++语言语法的一部分,C++中,你可能会将它们作为函数来重载,如果你不想要默认行为,对于复杂类型或用户定义的类型,语言可能不具有操作符的语义,因此,yuser可以用自己的实现让它们负担过重。

虽然我仍然认为这个问题基本上是重复的,但在您所引用的特定上下文中,可能有必要澄清差异的含义

<> Pc>有一点,C++中的函数是一个有名称和可能函数参数的函数,并调用这个语法:

func(arg1,arg2,...)
换句话说,首先是名称,然后是圆括号,然后是逗号分隔的参数列表。这是C++的函数调用语法。 鉴于操作员的使用方式如本标准第5条所述。语法的细节取决于运算符的类型,例如有一元运算符,如
&
,二元运算符,如
+
*
等。;还有三元条件运算符
?:
,还有一些特殊关键字,如
new
delete
sizeof
,其中一些关键字转换为用户定义类型的函数调用,但它们不使用上述函数调用语法。也就是说,你不打电话

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


这就是作者在你引用的章节中提到的这种语法差异。

函数和运算符之间的实际区别取决于编程语言。在普通C语言中,运算符是语言本身的一部分。不能添加运算符,也不能更改现有运算符的行为。这不是C++的情况,操作符被解析为函数。

从一个完全不同的角度,考虑Haskell,其中任何(二进制)函数可以被看作二元运算符:

如果您不会说Haskell,但了解点积,那么这个例子应该还是相当直截了当的。鉴于:

dotP :: (Double, Double) -> (Double, Double) -> Double
dotP (x1, y1) (x2, y2) = x1 * x2 + y1 * y2
两者

我会给你11英镑

为解决GO文档中的引用:GO开发人员简单地强调,C++中的任何一个都将把新的关键字作为其自己的语法,应该将新的Go作为任何其他函数来对待。

“操作符和函数之间的区别是什么?” 语法。但事实上,这纯粹是一个关于 语言:在C++中,<代码> +/COD>是一个中缀运算符(并且只有 运算符可以是中缀),而

func()
将是一个函数。但是 甚至这也不总是正确的:
MyClass::operator+()
函数,但它可以,并且通常使用 运算符语法

其他语言有不同的规则:在Lisp等语言中, 没有真正的区别。人们可以区分 内置函数与用户定义函数,但 区别有点人为,因为你很容易 扩展lisp以添加其他内置函数。还有 允许使用中缀符号进行用户定义的语言 功能。像Python这样的语言在它们之间映射:
lhs
+rhs
映射到函数调用
lhs.\uuuu添加(rhs)
(so “运算符”实际上只是语法上的糖)

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

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

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

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


C++允许通过动态地向所述方法分配运算符求值,用方法重写(重载)运算符。这是一种语言“特征”——正如这个问题的存在所暗示的那样——主要让人困惑,在围棋中是不可用的。

你可以同时编写
a+b
a.operator+(b)
——运算符是语法糖。没错。但是这个事实已经在问题中提到了!这个问题与此无关。你不明白报价的哪一部分可能重复?现在还不清楚你到底在问什么。运算符是语言语法的一部分。函数使用多个运算符来执行操作。或者类似的。
dotP (1,2) (3,4)
(1,2) `dotP` (3,4)