2013-04-11 12 views
5

drucke ich ein bool zu einem Ausgangsstrom wie folgt aus:C++ boolesches Drucken, was wird angezeigt?

#include <iostream> 

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

Hat der Standard ein bestimmtes Ergebnis auf dem Strom erfordern (z 0 für false)?

+15

Warum versuchen Sie es nicht aus? –

+2

Wie sollen wir diese schließen? –

+0

Hinweis: Es wird garantiert, dass auf jedem konformen Compiler dasselbe ausgegeben wird. – chris

Antwort

56

Die Standardstreams haben ein boolalpha Flag, das bestimmt, was angezeigt wird - wenn es falsch ist, werden sie als 0 und 1 angezeigt. Wenn dies der Fall ist, werden sie als false und true angezeigt.

Es gibt auch ein std::boolalpha Manipulator das Flag zu setzen, so dass dies:

#include <iostream> 
#include <iomanip> 

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

... erzeugt eine Ausgabe wie:

0 
false 

Für das, was es wert ist, das erzeugte tatsächliche Wort, wenn boolalpha ist Satz auf true lokalisiert ist - das heißt, <locale> hat eine num_put Kategorie, die numerischen Konvertierungen behandelt, so dass, wenn Sie einen Stream mit der rechten locale tränken kann/wird true ausdrucken und false, wie sie in diesem Gebietsschema dargestellt werden. Zum Beispiel

#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; 
} 

... und zumindest in der Theorie (vorausgesetzt, Ihr Compiler/Standard-Bibliothek „fr“ als Kennung für „Französisch“ akzeptieren) könnte es faux statt false ausdrucken. Ich sollte jedoch hinzufügen, dass die tatsächliche Unterstützung dafür bestenfalls uneinheitlich ist - sogar die Dinkumware/Microsoft-Bibliothek (normalerweise ziemlich gut in dieser Hinsicht) druckt false für jede Sprache, die ich überprüft habe.

Die Namen, die verwendet werden, sind in einer numpunct Facette definiert, also wenn Sie wirklich wollen, dass sie richtig für bestimmte Sprache ausdrucken, können Sie eine numpunct Facette erstellen, um dies zu tun. Zum Beispiel eine, die (ich glaube) zumindest einigermaßen genau für Französisch würde wie folgt aussehen:

#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; 
} 

Und das Ergebnis ist (wie Sie wahrscheinlich erwarten würde):

0 
faux 
+3

Hinweis: Wenn std :: boolalpha verwendet werden kann, um Drucken" True " oder "false" anstelle von 0 oder 1, können Sie std :: noboolalpha verwenden, um das Gegenteil zu tun (0 oder 1 zu drucken) wieder –

+0

Ist das nicht "neu" ein Speicherleck? – Creep4Play

+0

@ Creep4Play: Nein - standardmäßig geben Sie die Eigenschaft der Facette an das Gebietsschema, die es automatisch zerstört, wenn das Gebietsschema zerstört wird. –

10

0 wird werde gedruckt.

wie in C++ wahre bezieht sich auf und falsche auf bezieht.

Im Fall möchten Sie falsch statt drucken, dann haben Sie die boolalpha Format-Flag für den str Strom setzt.

Wenn das boolalpha Format-Flag gesetzt ist, bool Werte werden durch ihre textuelle Darstellung eingefügt/extrahiert: entweder wahr oder falsch, anstelle von Integralwerten.

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

Ausgang:

false 

IDEONE