The standard streams have a boolalpha
flag that determines what gets displayed — when it’s false, they’ll display as 0
and 1
. When it’s true, they’ll display as false
and true
.
There’s also an std::boolalpha
manipulator to set the flag, so this:
#include <iostream> #include <iomanip> int main() { std::cout<<false<<"\n"; std::cout << std::boolalpha; std::cout<<false<<"\n"; return 0; }
…produces output like:
0 false
For what it’s worth, the actual word produced when boolalpha
is set to true is localized–that is, <locale>
has a num_put
category that handles numeric conversions, so if you imbue a stream with the right locale, it can/will print out true
and false
as they’re represented in that locale. For example,
#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; }
…and at least in theory (assuming your compiler/standard library accept “fr” as an identifier for “French”) it might print out faux
instead of false
. I should add, however, that real support for this is uneven at best–even the Dinkumware/Microsoft library (usually quite good in this respect) prints false
for every language I’ve checked.
The names that get used are defined in a numpunct
facet though, so if you really want them to print out correctly for particular language, you can create a numpunct
facet to do that. For example, one that (I believe) is at least reasonably accurate for French would look like this:
#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; }
And the result is (as you’d probably expect):
0 faux