prev up next   top/contents search

comp.lang.c FAQ list · Question 9.2

Q: Isn't #defining TRUE to be 1 dangerous, since any nonzero value is considered ``true'' in C? What if a built-in logical or relational operator ``returns'' something other than 1?


A: It is true (sic) that any nonzero value is considered true in C, but this applies only ``on input'', i.e. where a Boolean value is expected. When a Boolean value is generated by a built-in operator such as ==, !=, and <=, it is guaranteed to be 1 or 0. Therefore, the test

	if((a == b) == TRUE)
would work as expected (as long as TRUE is 1), but it is obviously silly. In fact, explicit tests against TRUE and FALSE are generally inappropriate. In particular, and unlike the built-in operators, some library functions (notably isupper, isalpha, etc.) return, on success, a nonzero value which is not necessarily 1, so comparing their return values against a single value such as TRUE is quite risky and likely not to work.

(Besides, if you believe that

if((a == b) == TRUE)
is an improvement over
if(a == b)
why stop there? Why not use:
if(((a == b) == TRUE) == TRUE)
or even:
if((((a == b) == TRUE) == TRUE) == TRUE)
See also Lewis Carroll's essay ``What the Tortoise Said to Achilles.'')

Given that

	if(a == b)
is a perfectly legitimate conditional, so is
	#include <ctype.h>

	...

	if(isupper(c))
		{ ... }
since isupper is known to return zero/nonzero for false/true. Similarly, there should not be any reluctance to use code like
	int is_vegetable;		/* really a bool */

	...

	if(is_vegetable)
		{ ... }
or
	extern int fileexists(char *);	/* returns true/false */

	...

	if(fileexists(outfile))
		{ ... }
as long as is_vegetable and fileexists() are of ``conceptual Boolean type.'' Alternatives like
	if(is_vegetable == TRUE)
or
	if(fileexists(outfile) == YES)
are not really any improvement. (They can be thought of as ``safer'' or ``better style,'' but they can also be thought of as risky or poor style. They certainly don't read as smoothly. See question 17.10.)

A good rule of thumb is to use TRUE and FALSE (or the like) only for assignment to a Boolean variable or function parameter, or as the return value from a Boolean function, but never in a comparison.

See also question 5.3.

References: K&R1 Sec. 2.6 p. 39, Sec. 2.7 p. 41
K&R2 Sec. 2.6 p. 42, Sec. 2.7 p. 44, Sec. A7.4.7 p. 204, Sec. A7.9 p. 206
ISO Sec. 6.3.3.3, Sec. 6.3.8, Sec. 6.3.9, Sec. 6.3.13, Sec. 6.3.14, Sec. 6.3.15, Sec. 6.6.4.1, Sec. 6.6.5
H&S Sec. 7.5.4 pp. 196-7, Sec. 7.6.4 pp. 207-8, Sec. 7.6.5 pp. 208-9, Sec. 7.7 pp. 217-8, Sec. 7.8 pp. 218-9, Sec. 8.5 pp. 238-9, Sec. 8.6 pp. 241-4
Lewis Carroll, ``What the Tortoise Said to Achilles''


prev up next   contents search
about this FAQ list   about eskimo   search   feedback   copyright

Hosted by Eskimo North