What advantage does _Bool
give?
The value of a _Bool
is either 0 or 1. Nothing else, unlike an int
.
Conversion to a _Bool
always converts non-zero to 1 and only 0 to 0.
When any scalar value is converted to _Bool, the result is 0 if the value compares equal to 0; otherwise, the result is 1.
Examples:
#include <math.h>
#include <stdlib.h>
_Bool all_false[] = { 0, 0.0, -0.0, NULL };
_Bool all_true[] = { 13, 0.1, 42.0, "Hello", NAN };
Notice the difference of conversion/casting to int
vs; _Bool
: (int) 0.1
--> 0, yet (_Bool) 0.1
--> 1.
Notice the difference of conversion/casting to unsigned
vs; _Bool
: (unsigned) 0x100000000
--> 0, yet (_Bool) 0x100000000
--> 1.
_Bool
adds clarity to boolean operations.
_Bool
is a distinctive type from int
, char
, etc. when used with _Generic
.
Prior to C99, C lacked _Bool
. Much early code formed their own types bool, Bool, boolean, bool8, bool_t, ...
. Creating a new type _Bool
brought uniformity to this common, yet non-uniform practice. <stdbool.h>
is available to use bool, true, false
. This allows older code, which does not include <stdbool.h>
to not break, yet newer code to use cleaner names.
OP's example with "doesn't enforce that a value is true/false or 1/0" does enforce that bools[2]
had a value of 1. It did not enforce that the initializer of 'c'
, an int
, had to be in the range of [0...1] nor of type _Bool
, much like int x = 12.345;
is allowed. In both cases, a conversion occurred. Although the 2nd often generates a warning.