C++ printing boolean, what is displayed?
Asked Answered
I

2

101

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)?

Ingot answered 11/4, 2013 at 22:31 Comment(13)
How should we close this one?Hemostat
Hint: it's guaranteed to print the same thing on every conforming compiler.Mainly
It would've been easier to type two lines of code...Szabadka
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?Ingot
@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.Hemostat
@Ingot Consider adding ideone to your repertoire.Hyperboloid
It would actually be quicker to use that than to post a SO question.Hyperboloid
What is the purpose of the first line?Hyperboloid
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::boolalphaRelator
voted to reopen, this is certainly a real question even if it is obvious to someUstulation
@AndyProwl That is wrong. I searched for an answer and found this in under a few seconds. For me to test this in an environment I could be pretty certain with, I'd have to open a new, clean project/file and write out the code myself, then compile. While many people do not have a fresh C environment to test in on hand, most have a web browser on hand.Intort
The fact that this question got closed is detestable of Stackoverflow. There is absolutely nothing wrong with this question. The fact that it has a simple, clear answer, and asks about what the specification dictates, makes it very useful to many. Simple != bad. Programmers of all people should know this.Intort
Related: What is the printf format specifier for bool?. See also the linked questions.Dissension
L
182

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
Lavadalavage answered 11/4, 2013 at 22:34 Comment(3)
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) againBunko
Isn't that new a memory leak?Lacilacie
@Creep4Play: No--by default you're giving ownership of the facet to the locale, which will destroy it automatically when the locale is destroyed.Lavadalavage
D
37

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

Diocletian answered 11/4, 2013 at 22:35 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.