许多语言都有幂运算符;为什么C++没有?例如,Fortran 和 Python 使用
**
,并且通常使用 ^
编写(例如,在 LaTeX 中)。
C++ 确实有一个幂运算符——它被写成
pow(x, y)
。
最初,C 是为了系统软件而设计的,并且 对电力操作员的需求并不大。 (但它有 按位运算符,如
&
和 |
,它们在很多情况下都不存在
其他语言。)有一些关于添加一个的讨论
在 C++ 标准化期间,但最终的共识是
或更少:
不可能是
^
,因为优先级是错误的(并且
当然,有 2. ^ 8 == 256.
,但是 2 ^ 8 == 10
并不是很
也很愉快)。不可能是
**
,因为那会破坏现有的
程序(可能有类似 x**p
的内容,其中 x
是
int
和 p
和 int*
)。可能是
*^
,因为这个序列目前不合法
在 C 或 C++ 中。但这仍然需要引入一个
额外的优先级。C 和 C++ 已经有足够的特殊标记和级别 优先级,并在与数字社区讨论后, 结论是确实没有什么问题
pow(x, y)
。 所以C++让事情保持原样,而这似乎并没有 造成任何问题。
有两个原因
符号
^
保留用于按位异或操作您可以使用
std::pow
来实现相同的功能。C++ 的好处是你可以重载
operator
来做任何你喜欢做的事!
template< typename T >
T operator^( T x, T y ) {
return std::pow( x, y );
}
但是请考虑到,当您这样做时,其他认识
C++
但不认识您的人(我相信其中有不少人)可能会在理解您的代码时遇到重大问题!
因为这是异或按位运算符。
有一些名为“pow”的函数可以做你想做的事情。
如果你愿意,你可以帮助自己
struct DoubleMock
{
DoubleMock(double v){_v = v;}
double _v;
};
double operator^(DoubleMock x, DoubleMock y)
{
return pow(x._v,y._v);
}
double v = DoubleMock(2.0) ^ 2.0;