Time to standardize "true" and "false"
Rahul Dhesi
dhesi at sun505.UUCP
Mon Sep 25 12:02:04 AEST 1989
(The referenced article had a follow-up header of "poster", which I
think is a nasty thing to have done.)
In article <9464 at attctc.Dallas.TX.US> wjf at attctc.Dallas.TX.US (Jesse Furqueron)
writes:
>#define FALSE 0
>#define TRUE !0
I suggest that defensive programmers eschew these constants because the
temptation to say
if (x == TRUE) ...
may overcome you some day and you will suffer, unless you can
universally guarantee that you didn't absent-mindedly do something like
x = isdigit(c);
If, on the other hand, you are willing to either be careful to always
say
x = (isdigit(c) != 0);
or if you alternatively define
#define ISTRUE(x) (x)
#define ISFALSE(x) (!(x))
and say
if (ISTRUE(x)) ...
if (ISFALSE(y)) ...
instead then the use of TRUE and FALSE is not so dangerous.
Best is just think binary and say:
x = 0; /* x is false */
y = 1; /* y is true */
and for testing use
if (x) ... /* if x is true */
if (!y) ... /* if y is false */
If you really must define a macro, try:
#define ONE 1
#define ZERO 0
Now if you see
if (x == ONE) ...
you immediately realize that this could fail to work.
The problem is that in C any nonzero value is considered to be
true when tested in a boolean context, so
#define TRUE 1
is misleading. In a richer language you could perhaps say:
#define TRUE [-inf..-1, 1..+inf]
Rahul Dhesi <dhesi%cirrusl at oliveb.ATC.olivetti.com>
UUCP: oliveb!cirrusl!dhesi
More information about the Comp.lang.c
mailing list