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.