Can I assume (bool)true == (int)1 for any C++ compiler?
According to the standard, you should be safe with that assumption. The C++ bool
type has two values - true
and false
with corresponding values 1 and 0.
The thing to watch about for is mixing bool
expressions and variables with BOOL
expression and variables. The latter is defined as FALSE = 0
and TRUE != FALSE
, which quite often in practice means that any value different from 0 is considered TRUE
.
A lot of modern compilers will actually issue a warning for any code that implicitly tries to cast from BOOL
to bool
if the BOOL
value is different than 0 or 1.
Is C/C++ bool type always guaranteed to be 0 or 1 when typecast'ed to int?
Yes:
In C++ (§4.5/4):
An rvalue of type bool can be
converted to an rvalue of type int,
with false becoming zero and true
becoming one.
In C, when a value is converted to _Bool
, it becomes 0 or 1 (§6.3.1.2/1):
When any scalar value is converted to
_Bool, the result is 0 if the value compares equal to 0; otherwise, the
result is 1.
When converting to int
, it's pretty straight-forward. int
can hold 0 and 1, so there's no change in value (§6.3.1.3).
Casting int to bool in C/C++
0 values of basic types (1)(2)map to false
.
Other values map to true
.
This convention was established in original C, via its flow control statements; C didn't have a boolean type at the time.
It's a common error to assume that as function return values, false
indicates failure. But in particular from main
it's false
that indicates success. I've seen this done wrong many times, including in the Windows starter code for the D language (when you have folks like Walter Bright and Andrei Alexandrescu getting it wrong, then it's just dang easy to get wrong), hence this heads-up beware beware.
There's no need to cast to bool
for built-in types because that conversion is implicit. However, Visual C++ (Microsoft's C++ compiler) has a tendency to issue a performance warning (!) for this, a pure silly-warning. A cast doesn't suffice to shut it up, but a conversion via double negation, i.e. return !!x
, works nicely. One can read !!
as a “convert to bool
” operator, much as -->
can be read as “goes to”. For those who are deeply into readability of operator notation. ;-)
1) C++14 §4.12/1 “A zero value, null pointer value, or null member pointer value is converted to false
; any other value is converted to true
. For direct-initialization (8.5), a prvalue of type std::nullptr_t
can be converted to a prvalue of type bool
; the resulting value is false
.”
2) C99 and C11 §6.3.1.2/1 “When any scalar value is converted to _Bool
, the result is 0 if the value compares equal to 0; otherwise, the result is 1.”
Using true and false in C
Just include <stdbool.h>
if your system provides it. That defines a number of macros, including bool
, false
, and true
(defined to _Bool
, 0, and 1 respectively). See section 7.16 of C99 for more details.
Using boolean values in C
From best to worse:
Option 1 (C99 and newer)
#include <stdbool.h>
Option 2
typedef enum { false, true } bool;
Option 3
typedef int bool;
enum { false, true };
Option 4
typedef int bool;
#define true 1
#define false 0
Explanation
- Option 1 will work only if you use C99 (or newer) and it's the "standard way" to do it. Choose this if possible.
- Options 2, 3 and 4 will have in practice the same identical behavior. #2 and #3 don't use #defines though, which in my opinion is better.
If you are undecided, go with #1!
Related Topics
Replace Substring With Another Substring C++
How to Create Directory Tree in C++/Linux
What Constitutes a Valid State For a "Moved From" Object in C++11
C++ Function Template Partial Specialization
How Do C++ Class Members Get Initialized If I Don't Do It Explicitly
How to Write a Power Function Myself
Atomic Double Floating Point or Sse/Avx Vector Load/Store on X86_64
Virtual Assignment Operator C++
C++ Call Pointer to Member Function
How to Efficiently Select a Standard Library Container in C++11
The Procedure Entry Point _Gxx_Personality_V0 Could Not Be Located
How Std::Unordered_Map Is Implemented
When Were the 'And' and 'Or' Alternative Tokens Introduced in C++
How Does Array[100] = {0} Set the Entire Array to 0
Difference Between String and Char[] Types in C++
Why Does C++ Require a User-Provided Default Constructor to Default-Construct a Const Object