2013-04-11 15 views
5

私はこのような出力ストリームにboolを印刷:C++の印刷ブール値、何が表示されますか?

#include <iostream> 

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

は標準ストリーム(falseため例えば0)上の特定の結果を必要としていますか?

+15

は、なぜあなたはそれを試してみませんか? –

+2

これを閉じるにはどうすればいいですか? –

+0

ヒント:すべての準拠のコンパイラで同じことを保証します。 – chris

答えて

56

標準ストリームには、何が表示されるかを決定するフラグboolalphaがあります。偽の場合、01と表示されます。それが真実であれば、falsetrueと表示されます。

ありフラグを設定するstd::boolalphaマニピュレータもありますので、この:boolalphaがあるときに生成何が価値があるのは、実際の単語について

0 
false 

#include <iostream> 
#include <iomanip> 

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

が...のような出力を生成trueに設定されているのはローカライズされています。つまり、数字の変換を処理するnum_putカテゴリがあります。したがって、正しいロケールでストリームにインプレッションを設定すると、trueと彼らがそのロケールで表現しているように。例えば、

#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」を受け入れる)それは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 
+3

注:std :: boolalphaを使って" true "または0または1の代わりに "false"を指定すると、std :: noboolalphaを使って反対側の(0または1を印刷する)ことができます –

+0

'new'はメモリリークですか? – Creep4Play

+0

@ Creep4Play:いいえ - デフォルトでは、ロケールの所有権をロケールに与えているため、ロケールが破棄されたときに自動的に破棄されます。 –

10

0意志印刷されます。

C++のよう

に偽を指すを指します。場合

、あなたはの代わりに、を印刷したい場合、あなたはstrのストリームのためのboolalphaフォーマットフラグを設定する必要があります。

boolalpha形式フラグが設定されている場合、ブール値は、整数値の代わりにtrueまたはfalseのテキスト表現で挿入/抽出されます。

#include <iostream> 
int main() 
{ 
    std::cout << std::boolalpha << false << std::endl; 
} 

出力

false 

IDEONE

関連する問題