C определяет макросы <stdbool.h>
true
и false
как расширение до целочисленных константных выражений значения 1
и 0
соответственно.Поскольку они int
s и bool
(_Bool
) сами по себе являются целочисленным типом, любое такое использование в равной степени допустимо.Даже значение логических выражений в C равно int
, а не bool
, поэтому вам не очень поможет функция bar
.
Однако foo
- это другоеbeast - если бы возвращаемое значение было true
, то оно было бы сразу поймано, потому что 1
не конвертируется в указатель.false
, имеющее целочисленное значение 0
равно константе нулевого указателя и будет преобразовано в нулевой указатель.Возможно, вы могли бы уловить неправильное использование, заменив #include <stdbool.h>
чем-то, что делает включение, но определяет false
как, скажем, 0.0
, что является ложным значением, но не целочисленным константным выражением.