Question 5.3

Is the abbreviated pointer comparison ``if(p)'' to test for non-null pointers valid? What if the internal representation for null pointers is nonzero?


When C requires the Boolean value of an expression (in the if, while, for, and do statements, and with the &&, ||, !, and ?: operators), a false value is inferred when the expression compares equal to zero, and a true value otherwise. That is, whenever one writes

	if(expr)
where ``expr'' is any expression at all, the compiler essentially acts as if it had been written as
	if((expr) != 0)
Substituting the trivial pointer expression ``p'' for ``expr,'' we have
	if(p)	is equivalent to	if(p != 0)
and this is a comparison context, so the compiler can tell that the (implicit) 0 is actually a null pointer constant, and use the correct null pointer value. There is no trickery involved here; compilers do work this way, and generate identical code for both constructs. The internal representation of a null pointer does not matter.

The boolean negation operator, !, can be described as follows:

	!expr	is essentially equivalent to	(expr)?0:1
		or to	((expr) == 0)
which leads to the conclusion that
	if(!p)	is equivalent to	if(p == 0)

``Abbreviations'' such as if(p), though perfectly legal, are considered by some to be bad style (and by others to be good style; see question 17.10).

See also question 9.2.

References: K&R2 Sec. A7.4.7 p. 204
ANSI Sec. 3.3.3.3, Sec. 3.3.9, Sec. 3.3.13, Sec. 3.3.14, Sec. 3.3.15, Sec. 3.6.4.1, Sec. 3.6.5
ISO Sec. 6.3.3.3, 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. 5.3.2 p. 122


Read sequentially: prev next up top


This page by Steve Summit // Copyright 1995 // mail feedback