31

许多语言都有幂运算符;为什么没有 C++?例如,Fortran 和 Python 使用**并且通常使用^.

4

4 回答 4

55

C++ 确实有一个幂运算符——它被写成pow(x, y).

最初,C 的设计考虑了系统软件,并没有太多需要强大的操作符。(但它有按位运算符,例如&and |,这在许多其他语言中是不存在的。)在 C++ 标准化期间有一些关于添加一个的讨论,但最终的共识或多或少是:

  • 不可能^,因为优先级是错误的(当然,有2. ^ 8 == 256.,但2 ^ 8 == 10也不是很愉快)。

  • 不可能**,因为那会破坏现有程序(可能有类似x**p,和xan 的东西)。intpint*

  • 可能是*^,因为这个序列目前在 C 或 C++ 中是不合法的。但这仍然需要引入额外的优先级。

  • C 和 C++ 已经有了足够多的特殊标记和优先级,在与数字社区讨论后,得出的结论是 pow(x, y).

所以 C++ 保持原样,这似乎没有造成任何问题。

于 2013-01-31T13:58:00.497 回答
10

有两个原因

  1. 该符号^保留用于按位异或运算

  2. 您可以使用std::pow来实现相同的功能。

C++ 的好处是你可以重载operator来做你喜欢做的任何事情!

template< typename T >
T operator^( T x, T y ) {
    return std::pow( x, y );
}

但是请注意,当您这样做时,其他认识C++和不认识您的人(我相信其中有不少)可能在理解您的代码时遇到重大问题!

于 2013-01-31T13:32:56.073 回答
1

因为那是排他或按位运算符。

有一些名为“pow”的函数可以做你想做的事。

于 2013-01-31T13:32:21.703 回答
0

如果你愿意,你可以帮助自己

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;
于 2013-01-31T13:56:20.940 回答