Serge
Serge

Reputation: 2074

comparison operator values C++

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

Answers (3)

Pete Becker
Pete Becker

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

P.P
P.P

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

Robᵩ
Robᵩ

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

Related Questions