1. ホーム
  2. c++

[解決済み] C++でbooleanを印刷すると、何が表示されますか?

2022-02-17 08:24:52

質問

を印刷します。 bool をこのように出力する。

#include <iostream>

int main()
{
    std::cout << false << std::endl;
}

規格はストリーム上で特定の結果を要求しているか(例えば 0 に対して false )?

解決方法は?

標準的なストリームには boolalpha フラグは、何を表示するかを決めるものです。 01 . trueの場合は、以下のように表示されます。 falsetrue .

また std::boolalpha マニピュレータでフラグを設定するので、これ。

#include <iostream>
#include <iomanip>

int main() {
    std::cout<<false<<"\n";
    std::cout << std::boolalpha;   
    std::cout<<false<<"\n";
    return 0;
}

...のような出力が得られます。

0
false

ちなみに、実際に生成される単語は boolalpha がtrueに設定されると、ローカライズされる--ということです。 <locale> には num_put カテゴリは数値の変換を行うので、ストリームに正しいロケールを設定すれば、次のように出力することができます。 truefalse を、そのロケールで表現されるようにします。例えば

#include <iostream>
#include <iomanip>
#include <locale>

int main() {
    std::cout.imbue(std::locale("fr"));

    std::cout << false << "\n";
    std::cout << std::boolalpha;
    std::cout << false << "\n";
    return 0;
}

...そして少なくとも理論的には(コンパイラや標準ライブラリが "fr" を "French" の識別子として受け入れると仮定して)、次のように表示されるかもしれません。 faux ではなく false . しかし、これに対する実際のサポートはせいぜいバラバラで、Dinkumware/Microsoft ライブラリでさえ(この点では通常かなり優れている)、以下のように印刷されることを付け加えておかなければなりません。 false は、私がチェックしたすべての言語についてです。

使用される名前は numpunct ファセットを作成する必要があります。 numpunct ファセットで行います。例えば、フランス語に対して少なくとも合理的な精度を持つものは、次のようになります(私はそう信じています)。

#include <array>
#include <string>
#include <locale>
#include <ios>
#include <iostream>

class my_fr : public std::numpunct< char > {
protected:
    char do_decimal_point() const { return ','; }
    char do_thousands_sep() const { return '.'; }
    std::string do_grouping() const { return "\3"; }
    std::string do_truename() const { return "vrai";  }
    std::string do_falsename() const { return "faux"; }
};

int main() {
    std::cout.imbue(std::locale(std::locale(), new my_fr));

    std::cout << false << "\n";
    std::cout << std::boolalpha;
    std::cout << false << "\n";
    return 0;
}

そして、その結果は、(おそらく皆さんが予想されるように)。

0
faux