JACH JACH - 2 months ago 8
C Question

Return value of a boolean expression in C

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?

Answer

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 type int. 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 type int.

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 type int.

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 type int.

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 type int.