Boolean Values

Understanding Boolean Values

Boolean values are the building blocks of logical operations, enabling programmers to express and manipulate true/false conditions in their code.

Boolean variables

Boolean variables are variables that can have only two possible values: true, and false.

To declare a  Boolean variable, we use the keyword bool. It can take one of two values: true or false.

bool boolUninitialized; // uninitialized, default to false
bool boolInitialized = true; // initialized

Boolean values are not actually stored in Boolean variables as the words true or false. Instead, they are stored as integers: true becomes the integer 1, and false becomes the integer 0. Similarly, when Boolean values are evaluated, they don't actually evaluate to true or false. They evaluate to the integers 0 (false) or 1(true). Because Booleans actually store integers, they are considered as integral type.

Printing Boolean values

When we print Boolean values, std::cout prints 0 for false and 1 for true:

#include <iostream>

int main()
{
    std::cout << true << '\n'; // true evaluates to 1
    std::cout << !true << '\n'; // !true evaluates to 0

    bool b {false};
    std::cout << b << '\n'; // b is false, which evaluates to 0
    std::cout << !b << '\n'; // !b is true, which evaluates to 1
    return 0;
}

// Output
1
0
0
1

If you want std::cout to print true or false instead of 0 or 1, you can use std::boolalpha Here's an example:

#include <iostream>

int main()
{
    std::cout << true << '\n';
    std::cout << false << '\n';

    std::cout << std::boolalpha; // print bools as true or false

    std::cout << true << '\n';
    std::cout << false << '\n';
    return 0;
}

// Output
1
0
true
false

You can use std::noboolalpha to turn it back off.

Integer to Boolean conversion

When using uniform initialization, you can initialize a variable using integer literals 0 (for false) and 1 (for true) but your really should be using false and true instead. Other integer literals cause compilation errors:

#include <iostream>

int main()
{
	bool bFalse { 0 }; // okay: initialized to false
	bool bTrue  { 1 }; // okay: initialized to true
	bool bNo    { 2 }; // error: narrowing conversions disallowed

	std::cout << bFalse << bTrue << bNo << '\n';

	return 0;
}

However, in any other context where an integer can be converted to a Boolean, the integer 0 is converted to false, and other integer is converted to true.

#include <iostream>

int main()
{
	std::cout << std::boolalpha; // print bools as true or false

	bool b1 = 4 ; // copy initialization allows implicit conversion from int to bool
	std::cout << b1 << '\n';

	bool b2 = 0 ; // copy initialization allows implicit conversion from int to bool
	std::cout << b2 << '\n';


	return 0;
}

// Output
true
false

Note: bool b1 = 4; may generate a warning. If so you will have to disable treating warnings as errors to compile the example.

Inputting Boolean values

Inputting Boolean values using std::cin sometimes trips new programmers up.

Consider the following example:

#include <iostream>

int main()
{
	bool b{}; // default initialize to false
	std::cout << "Enter a boolean value: ";
	std::cin >> b;
	std::cout << "You entered: " << b << '\n';

	return 0;
}
Enter a Boolean value: true
You entered: 0

What just happened here?

It turns out that std::cin only accepts two inputs for Boolean variables: 0 and 1. (not true or false). Any other inputs will cause std::cin to silently fail. In this case, because we entered true, std::cin silently failed. A failed input will also zero-out the variable, so b also gets assigned value false. Consequently, when std::cout prints a value for b, it prints 0.

To allow std::cin to accept false and true as inputs, the std::boolalpha options has to be enabled:

#include <iostream>

int main()
{
	bool b{};
	std::cout << "Enter a boolean value: ";

	// Allow the user to enter 'true' or 'false' for boolean values
	// This is case-sensitive, so True or TRUE will not work
	std::cin >> std::boolalpha;
	std::cin >> b;

	std::cout << "You entered: " << b << '\n';

	return 0;
}

However, when std::boolalpha is enabled, 0 and 1 will no longer be interpreted as Booleans inputs. (they both resolve to “false" as does any non-true input).