为什么C ++没有power运算符?

时间:2013-01-31 13:31:22

标签: c++ operator-keyword

许多语言都有权力运营商;为什么不是C ++?例如,Fortran和Python使用**并且通常使用^编写(例如,在LaTeX中)。

4 个答案:

答案 0 :(得分:45)

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

最初,C的设计考虑了系统软件,并且 对电力运营商的需求不大。 (但它有 按位运算符,如&|,它们很多都不存在 其他语言。)有一些关于添加一个的讨论 在C ++标准化过程中,最终的共识更多 或更少:

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

  • 它不能是**,因为这会破坏现有的 程序(可能包含x**pxint pint**^)。

  • 可能是pow(x, y),因为此序列目前不合法 在C或C ++中。但这仍然需要引入一个 额外的优先级。

  • C和C ++已经有足够的特殊令牌和等级 优先,并在与数字社区讨论后, 结论是,确实没有任何问题 {{1}}。

所以C ++留下了原样,而这似乎没有 造成任何问题。

答案 1 :(得分:9)

有两个原因

  1. 符号^保留用于按位xor operation

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

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

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

    然而考虑到,当您这样做时,其他知道C++并且不认识您的人(我相信其中有很多人)可能会<了解您的代码时遇到的问题很严重

答案 2 :(得分:1)

因为那是独占或按位运算符。

有一些叫做“战俘”的功能可以做你想做的事。

答案 3 :(得分:1)

如果你想要你可以帮助自己

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;