web-dev-qa-db-ja.com

C ++にべき乗演算子がないのはなぜですか?

多くの言語にはパワーオペレータがあります。なぜC++を使用しないのですか?たとえば、FortranとPython use **であり、一般的に(たとえばLaTeXで)^

25
user2015064

C++にはべき乗演算子があります。pow(x, y)と記述されています。

もともと、Cはシステムソフトウェアを念頭に置いて設計されていたため、パワーオペレータはあまり必要ありませんでした。 (しかし、他の多くの言語にはない&|のようなビットごとの演算子があります。)C++の標準化中に追加することについていくつかの議論がありましたが、最終的な合意は多かれ少なかれでした。

  • 優先順位が間違っていたため、^にはなりませんでした(そしてもちろん、2. ^ 8 == 256.を持っていますが、2 ^ 8 == 10も快適ではありません)。

  • **は、既存のプログラム(xintpx**pのようなint*のようなもの)を壊す可能性があるため、できませんでした。

  • これは*^である可能性があります。このシーケンスは現在、CまたはC++では有効ではないためです。ただし、これには追加の優先レベルを導入する必要があります。

  • CとC++にはすでに十分な特別なトークンと優先レベルがあり、数値コミュニティとの議論の後、pow(x, y)には何も問題はないと結論付けられました。

そのため、C++は現状のままにしておき、これは問題を引き起こしていないようです。

46
James Kanze

2つの理由

  1. シンボル^はビット単位のxor operation のために予約されています

  2. std::powを使用して同じ機能を実現できます。

C++の良いところは、operatorをオーバーロードして好きなことをできることです!

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

ただし、それを行うとき、C++を知っていて、あなたを知らない他の人々(そして、それらのいくつか)は、コードの理解に重大な問題があるかもしれません!

9
Shai

あなたが望むなら、あなたは自分自身を助けることができます

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;
1

それは排他的またはビットごとの演算子だからです。

あなたがしたいことをする「パウ」と呼ばれる機能があります。

1
Mats Petersson