2013-04-11 13 views
5

Ho stampare una bool ad un flusso di output come questo:C++ stampa booleana, cosa viene visualizzato?

#include <iostream> 

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

Vuol lo standard richiedono un risultato specifico sul torrente (ad esempio 0 per false)?

+15

Perché non provarlo? –

+2

Come dovremmo chiudere questo? –

+0

Suggerimento: è garantito stampare la stessa cosa su ogni compilatore conforme. – chris

risposta

56

Gli stream standard hanno un flag boolalpha che determina ciò che viene visualizzato - quando è falso, verrà visualizzato come 0 e 1. Quando è vero, verranno visualizzati come false e true.

C'è anche un std::boolalpha manipolatore per impostare il flag, quindi questo:

#include <iostream> 
#include <iomanip> 

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

... produce un output simile:

0 
false 

Per quello che vale, la parola effettivamente prodotta quando boolalpha è impostato su true è localizzato - ovvero, <locale> ha una categoria num_put che gestisce le conversioni numeriche, quindi se si inserisce un flusso con le impostazioni internazionali corrette, può/stamperà true e false come sono rappresentati in quella localizzazione. Ad esempio,

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

... e almeno in teoria (supponendo che il/libreria standard compilatore accetta "fr" come identificatore per "francese") potrebbe stampare faux invece di false. Dovrei aggiungere, tuttavia, che il vero supporto per questo è alquanto irregolare - anche la libreria Dinkumware/Microsoft (di solito abbastanza buona a questo riguardo) stampa false per ogni lingua che ho controllato.

I nomi utilizzati sono definiti in un aspetto di numpunct, quindi se si desidera che vengano stampati correttamente per una lingua specifica, è possibile creare una faccetta di numpunct. Ad esempio, uno che (credo) è almeno ragionevolmente accurate per il francese sarebbe simile a questa:

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

e il risultato è (come si sarebbe probabilmente aspetta):

0 
faux 
+3

: quando std :: boolalpha può essere usato per abilitare la stampa" true " o "false" invece di 0 o 1, puoi usare std :: noboolalpha per fare il contrario (stampa 0 o 1) di nuovo –

+0

Non è "nuova" una perdita di memoria? – Creep4Play

+0

@ Creep4Play: No: per impostazione predefinita si assegna la proprietà del facet alle impostazioni internazionali, che lo distruggeranno automaticamente quando la locale verrà distrutta. –

10

0 volontà essere stampato

Come in C++ vero riferisce a e falso riferisce a .

Nel caso in cui, si desidera stampare falsa invece di , allora dovete imposta il flag formato boolalpha per il flusso str.

Quando il flag boolalpha è impostato, i valori bool vengono inseriti/estratti dalla loro rappresentazione testuale: true o false, anziché valori interi.

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

uscita:

false 

IDEONE

Problemi correlati