JACH - 6 months ago 26

C Question

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`

.