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