In C, there is no built-in bool
type. You can use any scalar type
(char
, short
, unsigned
, etc., even float
!)
to represent a boolean value. The value 0 (zero) means false, and any
non-zero value means true.
This convention started with the root of assembly language programming. There is no boolean type in assembly language. However, it is common to use the Z (zero) flag of an ALU (arithmetic and logic unit) to indicate true or false. Though handy, this ``feature'' of C often leads to disaster.
Let's consider the following code:
int x, y; // ... if (x == y) { cout << "same" << endl; } else { cout << "different" << endl; }
This is fine. The result of a comparison should be of boolean type. Furthermore, the condition of an if-else statement should expect a boolean expression. What if there is a typo, and the code becomes the following?
if (x = y) // one equal!
gcc
, by default, does not generate a warning. If you turn on the
warnings, it'll say
``suggest parentheses around assignment used as truth value''.
What is the value of x = y
? It is the value of y
! As a
result, the behavior of the code changes in subtle ways. Note that
the value of x
also gets changed in the incorrect code, leading
to more problems down the line.
This happens because of two reasons. First, C treats assignment as an operator, not a statement. Therefore, it is possible to specify an assignment in a condition. Second, C has no boolean type, so any scalar expression is okay in a condition.
C++ does have a built-in bool
type. It also has built-in constants
true
and false
. However, without enforcing that
logical operators must have bool
types on both sides, and
that conditions must be bool
expressions, the introduction of
the bool
type has limited use.
Copyright © 2006-08-29 by Tak Auyeung