### 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