[c++] std :: numeric_limits <unsigned char>メンバへの呼び出しの前に、単項 "+"の目的は何ですか?



Answers

+は、 unsigned charint変換します。 +演算子は値を保持しますが、そのオペランドに積分昇格を誘導する効果があります。 operator <<が文字型が与えられたときに出力する、ある(半)ランダムな文字の代わりに数値を参照するようにしています。

Question

私は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()

私はそれをテストし、それを " - "に置き換え、それも働いた。 このような "+"演算子の使用は何ですか?




basic_ostream& operator<<( char value );ありませんbasic_ostream& operator<<( char value ); std::basic_ostreamオーバーロードはページの最後に説明されています

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

char変数を渡すときに呼び出されるメンバ以外のオーバーロードは、次のcharです。

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

文字chを出力する

したがって、基本的にcharsigned charまたはunsigned charをストリームに直接渡すと、文字が出力されます。 あなたが+を削除しようとすると、あなたが期待するものではないいくつかの "奇妙な"または見えない文字が印刷されることがわかります

それらの数値を代わりに使用する場合は、 shortintlongまたはlong longのオーバーロードを呼び出す必要があります。 これを行う最も簡単な方法は、 charからintへの単項プラスの宣伝です。 intへの明示的なキャストも機能します

そのような問題に直面した多くの人がいます。

  • coutはunsigned charを出力しない
  • std :: cout uint8_tを文字として扱う
  • uint8_tはcoutで印刷できません



Links