単項プラス演算子は何をしますか?私が見つけたいくつかの定義がありますが(こことここ)、それが何に使用されるのかまだわかりません。何もしないようですが、理由がありますよね?
回答:
あなたが必要を感じたら、それは過負荷になるはずです。事前定義されたすべてのタイプの場合、基本的には何もしません。
no-op単項算術演算子の実際の使用法はかなり制限されており、演算子自体ではなく、算術式で値を使用した場合の結果に関連する傾向があります。たとえば、小さい整数型からに拡張を強制しint
たり、式の結果が右辺値として扱われるため、非const
参照パラメーターと互換性がないことを確認したりするために使用できます。ただし、これらの使用法は、読みやすさよりもコードゴルフに適していると思います。:-)
int
して右辺値を生成するのは式の効果です+演算子自体ではなく、-ness。
実際、単項プラスは、Cでも何かを実行します。これは、オペランドに対して通常の算術変換を実行し、より広い幅の整数である可能性のある新しい値を返します。元の値が、よりも幅が狭い符号なし整数であった場合も、値にint
変更さsigned
れます。
通常、これはそれほど重要ではありませんが、効果がある可能性があるため、整数が正であることを示す一種の「コメント」として単項プラスを使用することはお勧めできません。次のC ++プログラムについて考えてみます。
void foo(unsigned short x)
{
std::cout << "x is an unsigned short" << std::endl;
}
void foo(int x)
{
std::cout << "x is an int" << std::endl;
}
int main()
{
unsigned short x = 5;
foo(+x);
}
「xはintです」と表示されます。
したがって、この例では、単項プラスは、異なるタイプと符号付きの新しい値を作成しました。
an integer of greater width
ですか?
デバッグなどの理由で生のバイトの数値(たとえば、charとして格納されている小さな数値)を出力する必要がある場合は、単項+を使用すると印刷コードを簡略化できます。検討する
char c = 42;
cout << c << endl; // prints "*\n", not what you want in this case
cout << (int)c << endl; // prints "42\n", ok
cout << +c << endl; // prints "42\n", much easier to type
これは簡単な例です。単項+が、バイトをテキストではなく数値のように扱うのに役立つ場合もあると思います。
歴史的な一口。C99標準化委員会はまた、単項プラスの既存の使用はかなりまれであると考えました。これは、単項プラスを再利用して言語の別の機能を実現することを検討していることからも明らかです。浮動小数点定数式の翻訳時間評価の禁止です。Cの理論的根拠のセクションF.7.4からの次の引用を参照してください。
この仕様の初期のバージョンでは、変換時定数の算術演算が可能でしたが、オペランドに適用すると、単項+演算子を使用して、定数式の変換時評価を禁止することができました。
結局、セマンティクスは逆になり、ほとんどのコンテキストで実行時評価が実施され(少なくとも「あたかも」ルールまで)、静的初期化子を使用して変換時評価を実施できるようになりました。主な違いは、浮動小数点例外の発生、およびその他の浮動小数点の丸めまたは精度設定(存在する場合)にあることに注意してください。
単項プラスはCに存在し、まったく何もしませんでした(auto
キーワードのように)。それを持たないために、StroustrupはCとの不必要な非互換性を導入しなければならなかったでしょう。
C ++になると、単項マイナスのようにオーバーロード関数を許可するのが自然でした。Stroustrupがまだ存在していなかった場合は、その理由でそれを導入した可能性があります。
だから、それは何の意味もありません。これは、物事をより対称的に見せるための一種の装飾として使用できます。たとえば、-1.5の反対として+1.5を使用します。C ++では、オーバーロードされる可能性がありますが、operator+()
何かを行うと混乱します。標準の規則を覚えておいてint
ください。算術演算子をオーバーロードするときは、sのように実行してください。
それがそこにある理由を探しているなら、Cの初期の歴史について何かを見つけてください。Cは実際には設計されていなかったので、正当な理由はなかったと思います。役に立たないauto
キーワード(おそらくstatic
、現在C ++ 0xでリサイクルされているのとは対照的)と、entry
何もしなかった(後でC90で省略された)キーワードについて考えてみます。RitchieまたはKernighanが、オペレーターの優先順位に問題があることに気付いたとき、壊れたくない数千行のコードを含む3つのインストールがすでにあったと言っている有名な電子メールがあります。
entry
:(stackoverflow.com/q/254395/153285)。最近では、複数のエントリポイントが必要な場合は、末尾呼び出しとプロファイルに基づく最適化を使用するだけです。
extern volatile int foo;
、ステートメント+foo;
を与えられたコンパイラは、読み取りが行われたことを決定するための手段が存在すると考えられるプラットフォームで、示されたアドレスの読み取りを実行する必要があると思います。多くのコンパイラが礼儀としてそれを行うでしょうが、ステートメントが単に「foo」である場合にそれが必要になるかどうかはわかりません。
これについては何の出典も引用できませんが、明示的な型昇格のためであり、ロスレス型変換を意味することがわかりました。これにより、コンバージョン階層の最上位になります。
new_type operator+(old_type)
new_type(old_type)
operator(new_type)(old_type)
new_type operator=(old_type)
もちろん、それは私が約15年前に読んだマイクロソフト(本当に古い)c / c ++マニュアルの1つにあるメモの私の解釈からのものなので、一粒の塩でそれを取ってください。
常に正の数にするために使用できると思います。単項+演算子をオーバーロードしてabsにします。コードを難読化したいだけでない限り、他の開発者を混乱させる価値はありません。その後、それはうまくいくでしょう。
~
ですか?あなたの「反対」の定義が何であるかはわかりませんが、単項プラスと単項マイナスが現在行っていることの経験によってバイアスがかかっているのではないかと思います。
編集私は元の答えでwaaayyyオフだったので、完全に書き直しました。
これにより、型の明示的な宣言を正の値として処理できるようになります(ほとんどの場合、非数学演算であると思います)。否定の方が便利なようですが、違いが生じる可能性のある例を次に示します。
public struct Acceleration
{
private readonly decimal rate;
private readonly Vector vector;
public Acceleration(decimal rate, Vector vector)
{
this.vector = vector;
this.rate = rate;
}
public static Acceleration operator +(Acceleration other)
{
if (other.Vector.Z >= 0)
{
return other;
}
return new Acceleration(other.Rate, new Vector(other.vector.X, other.Vector.Y, -other.vector.Z));
}
public static Acceleration operator -(Acceleration other)
{
if (other.Vector.Z <= 0)
{
return other;
}
return new Acceleration(other.Rate, new Vector(other.vector.X, other.Vector.Y, -other.vector.Z));
}
public decimal Rate
{
get { return rate; }
}
public Vector Vector
{
get { return vector; }
}
}
+
、値を正にすることではなく、その符号を変更しないことです。
単に、どの数値が正であるかを納得させるために使用されたもの
例えば;
int a=10;
System.out.println(+x);// prints 10(that means,that number 10 multiply by +1,{10*+1})
//if we use unary minus
int a=10;
System.out.println(-x);//prints -10(that means,that number 10 multiply by +1,{10*-1})