Reputation: 2074
We all know C++ (while not a superset) is pretty much derived from C.
In C++, the operators <, <=, >, >=, ==, and != all have boolean return values. However, in C, the same operators returned 1 or 0, since there was no 'bool' type in C.
Since all integer values except 0 are treated as "true", and 0 is "false", I want to know:
Does C++ still restrict the return values of the operators to be 1 vs 0, or does a 'true', from one of these operators, return any 1-byte value, so long as it isn't 0?
I want to know since using these return values as explicit 1 or 0 would be useful in bitwise operations without branching.
As a terrible example, take the following:
bool timesTwo;
int value;
//...
if(timesTwo)
value << 1;
//vs
value << (int) timesTwo;
Upvotes: 3
Views: 4309
Reputation: 76523
The type bool
has two values: false
and true
. You can treat it as an integer, in which case, false
is converted to 0 and true
is converted to 1. That's all there is to it.
The C-style sort-of-boolean, where 0 is treated as false and non-zero is treated a true, leads to problems when someone naively does something like #define FALSE 0
and #define TRUE !FALSE
. That effectively defines TRUE
as 1, and comparisons like if (f() == TRUE)
can mysteriously fail. The correct test would be if (f() != FALSE)
. Of course, with a real boolean type, that's not an issue, because values that aren't false will always be the same.
Upvotes: 0
Reputation: 121427
In fact, bool
is automatically converted into integer in C++ (1 if true, 0 if false) when used in expressions and there's no need to cast.
value << (int) timesTwo;
The case is not necessary: if `timesTwo`` is true then
you can directly do without a casr:
value<<timesTwo;
which is equivalent to:
value<<1;
Upvotes: 2
Reputation: 168876
Does C++ still restrict the return values of the operators to be 1 vs 0, or does a 'true', from one of these operators, return any 1-byte value, so long as it isn't 0?
The comparison operators, assuming that they have not been overloaded, only ever return true
and false
.
int(true)
is always 1.
int(false)
is always 0.
So,
int one(1), two(2);
assert( (one<two) == 1 );
assert( (two<one) == 0 );
Upvotes: 5