Я печатаю bool
в выходной поток следующим образом:
#include <iostream>
int main()
{
std::cout << false << std::endl;
}
Требуется ли стандарту конкретный результат в потоке (например, 0
для false
)?
Я печатаю bool
в выходной поток следующим образом:
#include <iostream>
int main()
{
std::cout << false << std::endl;
}
Требуется ли стандарту конкретный результат в потоке (например, 0
для false
)?
Стандартные потоки имеют флаг 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
установлено в true, локализовано, то есть <locale>
имеет категорию num_put
, которая обрабатывает числовые преобразования, поэтому, если вы наполните поток правильной locale, он может/будет распечатывать 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" как идентификатор для "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
0 будет напечатано.
Как и в С++ true относится к 1 и false относится к 0.
В случае, если вы хотите напечатать false вместо 0, тогда вы должны установить флаг формата boolalpha для потока str.
Когда установлен флаг формата boolalpha, значения bool вставляются/извлекаются их текстовым представлением: либо true, либо false вместо целых значений.
#include <iostream>
int main()
{
std::cout << std::boolalpha << false << std::endl;
}
Выход:
false