为什么没有一元运算符来获得乘法逆?0-x = -x ...1/x =?

Why isn't there a unary operator to get a multiplicative inverse? 0-x = -x ... 1/x =?

本文关键字:0-x 运算符 一元 为什么      更新时间:2023-10-16

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

int x = 2, y = 2;
assert(x + (-x) == 0);

从数学的角度来看,写-x或0-x并不重要,但从程序员的角度来看,这是重要的。用于计算-x的指令序列通常与用于计算0-x的指令序列不同!在c++中使用一元减号运算符实际上是有意义的,尽管它只是语法上的糖。那么一元算子返回的是乘法逆函数吗?但是为什么c++(像许多(大多数?所有?)语言一样)缺少这样的操作符?

编辑:

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

因为数学中没有一元乘法逆符号

您可以将其表示为x^-11/x,这两个都可以在c++中关闭(尽管以一种迂回的方式获得功率)。

一元否定之所以存在,是因为它存在于数学中。

Guvante的回答正确地指出,乘法逆运算没有通用的数学符号(尽管x-1可以被宽泛地认为是一个后缀运算符)。

此外,c++是从C语言派生而来,而C语言又从B语言派生而来。B语言甚至没有浮点运算。

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

从B到C再到c++,

算术运算符的集合没有太大变化。我认为一元+的加入是最大的变化。

此外,即使对于浮点数,也确实不太需要乘法逆运算符。编写1.0 / x很容易——任何合适的编译器都会生成与应用于x的假设逆运算符相同的代码。(对于某些cpu,该代码将对值1.0x应用除法运算符。)