Reputation: 1048
For reasons that are not worth mentioning, I want to know if there's a standard defined value for boolean expressions. E.g.
int foo () {
return (bar > 5);
}
The context is that I'm concerned that our team defined TRUE as something different than 1, and I'm concerned that someone may do:
if (foo() == TRUE) { /* do stuff */ }
I know that the best option would be to simply do
if (foo())
but you never know.
Is there a defined standard value for boolean expressions or is it up to the compiler? If there is, is the standard value something included in C99? what about C89?
Upvotes: 2
Views: 8609
Reputation: 34588
The C
programming language does not define Boolean value. Traditionally, the C
programming language uses integer
types to represent boolean data types.
Boolean values in C:
0 = false`
Any other value = true`
Usually people will use 1
for true.
C99 introduced the_Bool
data type that is not available in other C
derivates.See wikipedia link here. Additionally, a new header stdbool.h
has been added for compatibility reasons. This header allows programmers to use boolean
types in the same way, as in C++
language.
To use bool
in C
, we can use enum
as below.
enum bool {
false, true
};
bool value;
value = bool(0); // False
value = bool(1); // True
if(value == false)
printf("Value is false");
else
printf("Value is true");
Also, related Stack overflow question Is bool a native C type?
Upvotes: 0
Reputation: 223719
An operator such as ==
, !=
, &&
, and ||
that results in a boolean value will evaluate to 1 of the expression is true and 0 if the expression is false. The type of this expressing is int
.
So if the TRUE
macro is not defined as 1
, a comparison such as the above will fail.
When an expression is evaluated in a boolean context, 0 evaluates to false and non-zero evaluates to true. So to be safe, TRUE
should be defined as:
#define TRUE (!0)
As was mentioned in the comments, if your compiler is C99 compliant, you can #include <stdbool.h>
and use true
and false
.
According to C99:
6.5.3.3 (Unary arithmetic operators)
The result of the logical negation operator
!
is 0 if the value of its operand compares unequal to 0, 1 if the value of its operand compares equal to 0. The result has typeint
. The expression!E
is equivalent to(0==E)
.
6.5.8 (Relational operators)
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 typeint
.
6.5.9 (Equality operators)
The
==
(equal to) and!=
(not equal to) operators are analogous to the relational operators except for their lower precedence. Each of the operators yields 1 if the specified relation is true and 0 if it is false. The result has typeint
.
6.5.13 (Logical AND operator)
The
&&
operator shall yield 1 if both of its operands compare unequal to 0; otherwise, it yields 0. The result has typeint
.
6.5.14 (Logical OR operator)
The
||
operator shall yield 1 if either of its operands compare unequal to 0; otherwise, it yields 0. The result has typeint
.
Upvotes: 6