bool to int conversion
C++CC99C++ Problem Overview
How portable is this conversion. Can I be sure that both assertions pass?
int x = 4<5;
assert(x==1);
x = 4>5;
assert(x==0);
Don't ask why. I know that it is ugly. Thank you.
C++ Solutions
Solution 1 - C++
int x = 4<5;
Completely portable. Standard conformant. bool
to int
conversion is implicit!
§4.7/4 from the C++ 11 or 14 Standard, §7.8/4 from the C++ 17 Standard, §7.3.9/2 from the 20 Standard says (Integral Conversion)
> If the source type is bool, the value false
is converted to zero and
> the value true
is converted to one.
As for C, as far as I know there is no bool
in C. (before 1999) So bool
to int
conversion is relevant in C++ only. In C, 4<5
evaluates to int
value, in this case the value is 1
, 4>5
would evaluate to 0
.
EDIT: Jens in the comment said, C99 has _Bool
type. bool
is a macro defined in stdbool.h
header file. true
and false
are also macro defined in stdbool.h
.
§7.16 from C99 says,
>The macro bool
expands to _Bool.
>
>[..] true
which expands to the integer constant 1
, false
which expands to the integer constant 0
,[..]
Solution 2 - C++
You tagged your question [C] and [C++] at the same time. The results will be consistent between the languages, but the structure of the the answer is different for each of these languages.
In C language your examples has no relation to bool
whatsoever (that applies to C99 as well). In C language relational operators do not produce bool
results. Both 4 > 5
and 4 < 5
are expressions that produce results of type int
with values 0
or 1
. So, there's no "bool to int conversion" of any kind taking place in your examples in C.
In C++ relational operators do indeed produce bool
results. bool
values are convertible to int
type, with true
converting to 1
and false
converting to 0
. This is guaranteed by the language.
P.S. C language also has a dedicated boolean type _Bool
(macro-aliased as bool
), and its integral conversion rules are essentially the same as in C++. But nevertheless this is not relevant to your specific examples in C. Once again, relational operators in C always produce int
(not bool
) results regardless of the version of the language specification.
Solution 3 - C++
Section 6.5.8.6 of the C standard says:
> Each of the operators < (less than), > > (greater than), <= (less than or equal > to), and >= (greater than or equal to) > shall yield 1 if the specified > relation is true and 0 if it is > false.) The result has type int.
Solution 4 - C++
There seems to be no problem since the int to bool cast is done implicitly. This works in Microsoft Visual C++, GCC and Intel C++ compiler. No problem in either C or C++.