web-dev-qa-db-ja.com

単項プラス演算子は何をしますか?

単項プラス演算子は何をしますか?私が見つけたいくつかの定義があります( here および here )が、それが何に使われるのかまだわかりません。何もしないようですが、理由がありますよね?

73
vrish88

必要性を感じたら過負荷になることがあります。事前定義されたすべてのタイプでは、基本的に何もしません。

No-op単項算術演算子の実際の使用はかなり制限されており、演算子自体ではなく、算術式で値を使用した結果に関連する傾向があります。たとえば、小さい整数型からintへの強制的な拡張に使用したり、式の結果が右辺値として扱われるため、const以外の参照パラメーターと互換性がないことを確認できます。ただし、これらの用途は、読みやすさよりもゴルフのコード化に適していると申し上げます。 :-)

53
Jeffrey Hantin

実際、単項プラスdoesは何かを行います-Cであっても、usualを実行しますオペランドの算術変換は、新しい値を返します。この値は、より大きな幅の整数にすることができます。元の値がintより小さい幅の符号なし整数であった場合、signed値にも変更されます。

通常、これはそれほど重要ではありませんが、canは効果があるため、not整数が正であることを示す一種の「コメント」として単項プラスを使用することをお勧めします。次の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」と表示されます。

したがって、この例では、単項プラスは、異なるタイプandの符号付きの新しい値を作成しました。

106
Charles Salvia

K&R第2版から:

単項+はANSI標準で新しく追加されました。単項との対称性のために追加されました-。

33
Claudiu

明確にするために、正の値を負の値と区別して強調するために使用しているのを見ました:

shift(+1);
shift(-1);

しかし、それはかなり弱い使用です。答えは間違いなく過負荷です。

32
bbrown

組み込みの単項+は、左辺値を右辺値に変換します。たとえば、これを行うことができます

int x;
&x;

しかし、あなたはこれを行うことはできません

&+x;

:)

追伸「オーバーロード」は間違いなく正しい答えではありません。単項+はCから継承されており、Cにはユーザーレベルの演算子のオーバーロードはありません。

24
AnT

単項+が達成する主なことは、intよりも小さいデータ型のintへの型昇格です。これは、std::coutを数値データとして使用してcharデータを印刷する場合に非常に役立ちます。

char x = 5;
std::cout << +x << "\n";

とは非常に異なります

char x=5;
std::cout << x << "\n";

オーバーロードにも使用できますが、実際にはオーバーロードshouldはほぼNOPです。

14
jkerian

デバッグなどの理由で生バイトの数値(たとえば、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

これは簡単な例です。単項+が、バイトをテキストではなく数字のように扱うのに役立つ場合が他にもあると確信しています。

11
Nicu Stiurca

歴史的な情報。 C99標準化委員会は、言語の別の機能である浮動小数点定数式の翻訳時評価の禁止を再利用することを検討したことからもわかるように、既存の単項プラスの使用はかなりまれであると考えました。 Cの根拠、セクションF.7.4からの次の引用を参照してください。

この仕様の初期バージョンでは、変換時定数演算が許可されていましたが、オペランドに適用されると、単項+演算子が定数式の変換時評価を禁止するようになりました。

最終的に、セマンティクスは逆になり、ほとんどのコンテキストで実行時評価が実行され(少なくとも「あたかも」ルールまで)、静的初期化子を使用して翻訳時評価を実行することができました。主な違いは、浮動小数点例外の発生と、他の浮動小数点の丸めまたは精度設定(存在する場合)にあることに注意してください。

4
ndkrempel

単項プラスはCに存在し、そこではまったく何もしませんでした(autoキーワードによく似ています)。それを持たないためには、StroustrupはCとの不整合を導入する必要がありました。

C++になったら、単項マイナスのようにオーバーロード関数を許可するのが自然であり、Stroustrupがその理由でそれがまだない場合はそれを導入した可能性があります。

だから、それは何も意味しません。たとえば、-1.5の反対に+1.5を使用して、物事をより対称的に見せるための装飾の一種として使用できます。 C++では、オーバーロードされる可能性がありますが、operator+()が何かを行うと混乱を招きます。標準的なルールを覚えておいてください:算術演算子をオーバーロードするときは、intsのようなことをしてください。

そこにある理由を探しているなら、Cの初期の歴史について何かを見つけてください。Cは実際には設計されていなかったので、正当な理由はなかったと思います。役に立たないautoキーワード(おそらくstaticとは対照的に、現在C++ 0xでリサイクルされている)と、entryキーワードを検討してください。 C90)。 RitchieまたはKernighanが、オペレーターの優先順位に問題があることに気付いたときに、破壊を望まない数千行のコードを含む3つのインストールが既にあったと言っている有名な電子メールがあります。

3
David Thornley

あまりない。 operator+()のオーバーロードを許可する一般的な議論は、operator-()をオーバーロードするために実際に使用されることは間違いなく、very weird(or asymmetrical) operator-()ではなくoperator+()のオーバーロードを許可する場合。

最初にStroustropからこの議論を読んだと思うが、それを検証する権利を自分の本に持っていない。間違っているかもしれない。

3
Euro Micelli

私はこれのソースを引用することはできませんが、ロスレス型変換を意味する明示的な型プロモーションのためであることを理解するようになりました。これにより、変換階層の最上位に配置され、

  • プロモーション:new_type operator+(old_type)
  • 変換:new_type(old_type)
  • キャスト:operator(new_type)(old_type)
  • 強制:new_type operator=(old_type)

もちろん、それは約15年前に読んだMicrosoft(本当に古い)c/c ++マニュアルの1つにあるメモの解釈からです。

#include <stdio.h>
int main()
{
    unsigned short x = 5;
    printf ("%d\n",sizeof(+x)); 
    printf ("%d\n",sizeof(x)); 
    return 0;
}

上記の例に示すように、単項+は、実際にそれぞれタイプ4と2を変更します。表現+ xが実際にsizeofで計算されるのは奇妙なことです。おそらく、sizeofが単項+と同じ優先順位を持っているという事実によるものです。

1
Jose Ladeira

常に正の数にするために使用できると思います。単項演算子+をオーバーロードしてabsにします。コードを難読化したいだけでない限り、仲間の開発者を混乱させるほどの価値はありません。その後、うまく動作します。

0
Patrick