2013-04-11 2 views
5

Я печатать bool в выходной поток, как это:C++ print boolean, что отображается?

#include <iostream> 

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

Требует ли стандарт определенного результата на потоке (например, для 0false)?

+15

Почему бы вам не попробовать это? –

+2

Как мы должны закрыть этот? –

+0

Подсказка: он гарантированно печатает одно и то же на каждом соответствующем компиляторе. – chris

ответ

56

Стандартные потоки имеют флаг boolalpha, который определяет, что отображается, когда оно ложно, они будут отображаться как 0 и 1. Когда это правда, они будут отображаться как false и true.

Там также 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 является set to true локализуется, то есть <locale> имеет категорию num_put, которая обрабатывает числовые преобразования, поэтому, если вы введете поток с правильной локалью, он может/будет распечатывать true и false, поскольку они представлены в этом языке. Например,

#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 может использоваться для включения печати« истина », или «false» вместо 0 или 1, вы можете использовать std :: noboolalpha, чтобы сделать обратное (печать 0 или 1) снова –

+0

Разве это не «новая» утечка памяти? – Creep4Play

+0

@ Creep4Play: Нет - по умолчанию вы передаете право собственности на фасет в локаль, что автоматически уничтожит ее, когда локаль будет уничтожена. –

10

0 будет печататься.

Как и в C++ истинно относится к и ложные относится к .

В случае, если вы хотите напечатать ложные вместо , то вы должны устанавливает флаг формата boolalpha для потока ул.

Когда установлен флаг формата boolalpha, значения bool вставляются/извлекаются их текстовым представлением: либо true, либо false, вместо целых значений.

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

выход:

false 

IDEONE