Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/147.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么不是';难道没有一元运算符可以得到乘法逆吗?0-x=-x。。。1/x=?_C++_Operator Keyword - Fatal编程技术网

C++ 为什么不是';难道没有一元运算符可以得到乘法逆吗?0-x=-x。。。1/x=?

C++ 为什么不是';难道没有一元运算符可以得到乘法逆吗?0-x=-x。。。1/x=?,c++,operator-keyword,C++,Operator Keyword,在C/C++中有一个一元减号运算符,它返回算术类型的加法逆(至少在大多数情况下是这样),即 从数学的角度来看,写-x或0-x并不重要,但从程序员的角度来看,它确实重要。用于计算-x的指令序列通常与用于计算0-x的指令序列不同!在C++中有一个负运算实际上是有意义的,尽管只是语法糖。一元运算符返回乘法逆,对吗?但是为什么C++(像许多(最??)的语言)缺少这样的操作符?< /P> 编辑: 我的主要观点是,计算一个数x的倒数(加法或乘法)不需要计算机处理中性元素(分别为0或1)。事实上,0和1对于计

在C/C++中有一个一元减号运算符,它返回算术类型的加法逆(至少在大多数情况下是这样),即


从数学的角度来看,写-x或0-x并不重要,但从程序员的角度来看,它确实重要。用于计算-x的指令序列通常与用于计算0-x的指令序列不同!在C++中有一个负运算实际上是有意义的,尽管只是语法糖。一元运算符返回乘法逆,对吗?但是为什么C++(像许多(最??)的语言)缺少这样的操作符?< /P> 编辑:


我的主要观点是,计算一个数x的倒数(加法或乘法)不需要计算机处理中性元素(分别为0或1)。事实上,0和1对于计算机来说是非常重要的实体。虽然对浮点类型(如C中的float或double)计算0.0-x或1.0/x相当“简单”(精度在这里仍然是一个大问题),但它通常会变得相当复杂。就像muti。精度浮点类型0.0-x比-x复杂得多,因此-x不仅方便而且生成的代码效率更高。另一方面,我们必须引入一个函数,如inv(x)或x.inv()或其他任何函数,以实现相同的乘法(乘法逆),而不是仅仅为1.0/x写入/x。。。不仅如此,这种算子的缺乏不仅在C和C++中是可见的,而且在许多其他语言中,即使在主要为数学设计的语言中,也让我感到困惑;p> 因为数学中没有一元乘法逆符号

您可以将其表示为“代码> X^ - 1”/代码>或<代码> 1 /x这两者在C++中也可以向下(虽然在迂回曲折的方式下)。 一元否定之所以存在,是因为它存在于数学中。

正确地指出,乘法逆没有通用的数学表示法(尽管x-1可以粗略地认为是后缀运算符)

此外,C++是从C中派生出来的。B语言甚至没有浮点运算

C本身主要是一种系统编程语言,它更强调整数而不是浮点运算。整数上的乘法逆运算不是特别有用。(好吧,它可能对模运算有用,但C无符号类型的行为不是这样的。)

<> P>算术算子集合从B到C++没有很大变化。我认为增加一元
+
是最大的变化


此外,即使是浮点运算,也不需要乘法逆运算符。编写
1.0/x
非常简单,任何一个好的编译器都会生成与应用于
x
的假设逆运算符相同的代码。(对于某些CPU,该代码将对值
1.0
x
应用除法运算符。)

“用于计算-x的指令序列通常不同于用于计算0-x的指令序列!”-你似乎被困在80年代,没有优化编译器。至于实际问题:因为数学中也没有这样的惯例(因此发明这样的运算符是不明显的/不值得的)。我个人不知道是否存在这样的符号;我还从来没有遇到过它。“为什么[我最喜欢的编程语言]中没有包含此功能”这一形式的每个问题的答案都是一样的:好处并没有超过成本。@user3477950啊哈,好了,明白了,主要原因是你真的不需要这样的操作符。只要把它写成1/x,你有3个字符要写,再简单不过了。此外,有时(在模块或环中)可能没有非乘法逆,所有的地狱都会消失。我完全看不出用符号表示的好处。在数学中,也没有一元倒数运算符。你必须说
1/x
x^(-1)
$\forall x\in\mathbb{R}:x':=x^{-1}$在数学中一切都是符号。。。特别是$x^{-1}$和$1/x$。我们可以很容易地找到一个简单的输入(一个字符)符号,比如x'或其他什么。按位运算符在数学上也不存在。我认为一元否定之所以存在,是因为它是书写负数的自然延伸,而一元除法没有自然的类比。@LivingIssucide:那是不同的,一元否定是一个公认的标准。Heck甚至Haskell对编译器来说都是非常痛苦的。相反,您所建议的是一个唯一的返回到编译器中的符号。这样的事情的特征成本是天文数字,尤其是当你考虑C++有多大程度地滥用符号时,我希望有一个操作员在C/C++中运行“我的线性回归算法”,为什么他们不把它包含在语言中呢?你有这方面的消息来源吗?还是只是猜测?
int x = 2, y = 2;
assert(x + (-x) == 0);