108

I print a bool to an output stream like this:

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

Does the standard require a specific result on the stream (e.g. 0 for false)?

15
  • 15
    Not really. To get the answer, one has to write a brand new C++ code, compile it, and then run it. This is a common question that people will commonly search for. No clear answer exists on the net. I have now done mankind a favor and facilitated the answer for the world to see. This is the point of SO is it not? Commented Apr 11, 2013 at 22:53
  • 6
    @user788171: Writing a brand new 3-line C++ code, compiling it, and then running it takes less time than posting a question and/or searching for an answer on SO. Commented Apr 11, 2013 at 22:58
  • 7
    @user788171 Consider adding ideone to your repertoire. Commented Apr 11, 2013 at 23:08
  • 10
    What is the purpose of the first line? Commented Apr 11, 2013 at 23:11
  • 23
    This is now the first result on google for "cout bool". As such this question was definitly helpful and faster than opening ideone myself. Also the answer told me of the existance of std::boolalpha Commented Sep 21, 2017 at 9:39

2 Answers 2

196

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 
Sign up to request clarification or add additional context in comments.

3 Comments

note: when std::boolalpha may be used to enable printing "true" or "false" instead of 0 or 1, you can use std::noboolalpha to do the opposite (printing 0 or 1) again
Isn't that new a memory leak?
@Creep4Play: No--by default you're giving ownership of the facet to the locale, which will destroy it automatically when the locale is destroyed.
39

0 will get printed.

As in C++ true refers to 1 and false refers to 0.

In case, you want to print false instead of 0,then you have to sets the boolalpha format flag for the str stream.

When the boolalpha format flag is set, bool values are inserted/extracted by their textual representation: either true or false, instead of integral values.

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

output:

false 

IDEONE

Comments

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.