Я печатать bool
в выходной поток, как это:C++ print boolean, что отображается?
#include <iostream>
int main()
{
std::cout << false << std::endl;
}
Требует ли стандарт определенного результата на потоке (например, для 0
false
)?
Я печатать bool
в выходной поток, как это:C++ print boolean, что отображается?
#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
является 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
: когда std :: boolalpha может использоваться для включения печати« истина », или «false» вместо 0 или 1, вы можете использовать std :: noboolalpha, чтобы сделать обратное (печать 0 или 1) снова –
Разве это не «новая» утечка памяти? – Creep4Play
@ Creep4Play: Нет - по умолчанию вы передаете право собственности на фасет в локаль, что автоматически уничтожит ее, когда локаль будет уничтожена. –
0 будет печататься.
Как и в C++ истинно относится к и ложные относится к .
В случае, если вы хотите напечатать ложные вместо , то вы должны устанавливает флаг формата boolalpha для потока ул.
Когда установлен флаг формата boolalpha, значения bool вставляются/извлекаются их текстовым представлением: либо true, либо false, вместо целых значений.
#include <iostream>
int main()
{
std::cout << std::boolalpha << false << std::endl;
}
выход:
false
Почему бы вам не попробовать это? –
Как мы должны закрыть этот? –
Подсказка: он гарантированно печатает одно и то же на каждом соответствующем компиляторе. – chris