std :: numeric_limits <unsigned char>メンバーを呼び出す前の単項“ +”の目的は何ですか?


130

私はこの例をcppreferenceのドキュメントでましたstd::numeric_limits

#include <limits>
#include <iostream>

int main() 
{
    std::cout << "type\tlowest()\tmin()\t\tmax()\n\n";

    std::cout << "uchar\t"
              << +std::numeric_limits<unsigned char>::lowest() << '\t' << '\t'
              << +std::numeric_limits<unsigned char>::min() << '\t' << '\t'
              << +std::numeric_limits<unsigned char>::max() << '\n';
    std::cout << "int\t"
              << std::numeric_limits<int>::lowest() << '\t'
              << std::numeric_limits<int>::min() << '\t'
              << std::numeric_limits<int>::max() << '\n';
    std::cout << "float\t"
              << std::numeric_limits<float>::lowest() << '\t'
              << std::numeric_limits<float>::min() << '\t'
              << std::numeric_limits<float>::max() << '\n';
    std::cout << "double\t"
              << std::numeric_limits<double>::lowest() << '\t'
              << std::numeric_limits<double>::min() << '\t'
              << std::numeric_limits<double>::max() << '\n';
}

の「+」演算子がわかりません

<< +std::numeric_limits<unsigned char>::lowest()

私はそれをテストし、「-」で置き換えましたが、それもうまくいきました。そのような「+」演算子の使用は何ですか?


3
それを試してみてください。除外すると何が得られます+か?
ピートベッカー

4
コードの作成者がそれが何を意味するかを説明したり、代わりに明示的なキャストを使用したりする場合、この質問は尋ねる必要はありません...
user202729

に置き換えると-、出力が制限の正しい値にならない
phuclv

1
参考までに、このようなことを自分でGoogleに行いたい場合、これは「単項プラス」演算子と呼ばれます。単一の値(この場合、その直後のもの)をとるため、単項です。 "は、Googleと相性の良い方法+です。この場合、クエリはおそらく "c ++ unary plus"になります。それは...直感的ではなく、見つけたドキュメントを読むことを学ぶ必要がありますが、IMOは育成するのに役立つスキルです。
モニカの訴訟に資金を提供

回答:


137

(符号付きまたは符号なし)が<<渡されると、出力演算子char文字として書き込みます。

これらの関数はtypeの値を返しますunsigned char。上記のように、これらの値は整数値ではなく、現在のエンコーディングで表す文字を出力します。

+オペレータは、変換unsigned charにこれらの関数によって返さintを通して整数プロモーション。つまり、整数値が代わりに出力されます。

のような式+std::numeric_limits<unsigned char>::lowest()は、本質的にと同じstatic_cast<int>(std::numeric_limits<unsigned char>::lowest())です。


37

+をに変えるためunsigned charにありintます。+オペレータは、保存値であるが、それはそのオペランドに不可欠なプロモーションを誘導する効果があります。これはoperator <<、文字タイプが指定されたときに印刷される(半)ランダム文字ではなく、数値が表示されることを確認するためです。


18

すでに与えられた回答への参照を追加するだけです。CPP標準ワーキングドラフトN4713から

8.5.2.1単項演算子
...

  1. 単項+演算子のオペランドは、算術型、スコープなしの列挙型、またはポインタ型でなければならず、結果は引数の値です。整数の昇格は、整数または列挙オペランドで実行されます。結果のタイプは、昇格されたオペランドのタイプです。

そしてcharshortint、およびlong整数型です。


12

+結果なしでは異なります。a 97代わりに次のスニペット出力a a

char ch = 'a';
std::cout << ch << ' ' << +ch << '\n';

その理由は、異なるオーバーロードは異なるタイプのデータを印刷するためです。basic_ostream& operator<<( char value );オーバーロードはなくstd::basic_ostream、ページの最後で説明されています

文字と文字列の引数は(例えば、タイプのcharconst char*)によって処理されている非会員のオーバーロードoperator<<。出力にメンバ関数呼び出し構文を使用して文字をしようとすると(例えば、std::cout.operator<<('c');オーバーロードの1(2-4)と出力数値を呼び出します。メンバー関数呼び出し構文を使用して文字列を出力しようとすると、代わりにオーバーロード(7)が呼び出され、ポインター値が出力されます。

非会員の過負荷を渡すときに呼び出されるchar変数であります

template< class CharT, class Traits> basic_ostream<CharT,Traits>& operator<<(
    basic_ostream<CharT,Traits>& os, char ch );

コードポイントで文字を出力します ch

したがって、基本的にを渡すか、直接ストリームに渡すcharと、文字が出力されます。上記の行を削除しようとすると、「奇妙な」または目に見えない文字が印刷されることがわかります。signed charunsigned char+

あなたはそれらの数値をしたい場合は代わりに、あなたはのためのオーバーロードを呼び出す必要がありshortintlongまたはlong long。これを行う最も簡単な方法は、単項プラスで昇格するcharことです。これは、単項プラス演算子のまれな便利なアプリケーションの1つです。明示的なキャストも機能しますint+int

そのような問題に直面した人はたくさんいます


1
マイナスではなく、単項プラスですか?
ルスラン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.