多くの言語にはパワー演算子があります。なぜC++ではないのですか?たとえば、FortranとPythonはを使用**
し、通常はを使用して(たとえば、LaTeXで)記述され^
ます。
4 に答える
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 ++はそのままにしておきましたが、これによって問題が発生したことはないようです。
2つの理由で
シンボル
^
はビット単位のxor演算用に予約されています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;