为什么没有一元运算符来获得乘法逆?0-x = -x ...1/x =?
Why isn't there a unary operator to get a multiplicative inverse? 0-x = -x ... 1/x =?
在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^-1
或1/x
,这两个都可以在c++中关闭(尽管以一种迂回的方式获得功率)。
一元否定之所以存在,是因为它存在于数学中。
Guvante的回答正确地指出,乘法逆运算没有通用的数学符号(尽管x-1可以被宽泛地认为是一个后缀运算符)。
此外,c++是从C语言派生而来,而C语言又从B语言派生而来。B语言甚至没有浮点运算。
C本身主要是一种系统编程语言,它更强调整数而不是浮点运算。整数的乘法逆运算并不是特别有用。(好吧,它可能对模运算有用,但C的无符号类型不这样做。)
从B到C再到c++,算术运算符的集合没有太大变化。我认为一元+
的加入是最大的变化。
此外,即使对于浮点数,也确实不太需要乘法逆运算符。编写1.0 / x
很容易——任何合适的编译器都会生成与应用于x
的假设逆运算符相同的代码。(对于某些cpu,该代码将对值1.0
和x
应用除法运算符。)
- 为什么比较运算符如此快速
- C++映射:具有自定义类的运算符[]不起作用(总是返回0)
- 使用C++中的模板和运算符重载执行矩阵运算
- 为什么这个运算符<重载函数对 STL 算法不可见?
- 增量运算符与后缀混淆
- 一个关于在C++中重载布尔运算符的问题
- 运算符C++ "delete []"仅删除 2 个前值
- 模板类无法识别友元运算符
- 我可以使用条件运算符初始化C风格的字符串文字吗
- 关闭||运算符优化
- 通过继承类使用来自不同命名空间的运算符
- C++Cast运算符过载
- 如何使用AngelScript注册SFML Vector2运算符
- 重载元组索引运算符-C++
- 如何使用重载的相等(==)运算符向测试用例添加描述
- 为什么Mat类的两个对象可以在不重载运算符+的情况下添加
- 多个If语句与使用逻辑运算符计算条件的单个语句的比较
- 布尔比较运算符是如何在C++中工作的
- 重载运算符new[]的行为取决于析构函数
- 如何防止clang格式在流运算符调用之间添加换行符<<