我可以假设NULL值作为假吗?

Hyn*_*dil 6 c comparison pointers null-pointer conditional-statements

我知道,NULL == (void *)0但提到它可以表示为一个不包含全零的值.困扰我的是,如果这些代码片段对所有代码都是等价的(any_type *):

any_type *val;

if (val) { ... };
Run Code Online (Sandbox Code Playgroud)

if (val != NULL) { ... };
Run Code Online (Sandbox Code Playgroud)

hac*_*cks 10

是.您可以通过NULL这种方式使用宏.它是一个空指针常量,等于0.

comp.lang.c常见问题列表·问题5.3:

当C需要表达式的布尔值时,当表达式比较等于零时推断出false值,否则推断为true值.也就是说,无论什么时候写

if(expr)
Run Code Online (Sandbox Code Playgroud)

expr任何表达式都在哪里,编译器本质上就像它被写成一样

if((expr) != 0)
Run Code Online (Sandbox Code Playgroud)

用平凡的指针表达式p代替expr,我们有

if(p)   is equivalent to    if(p != 0)
Run Code Online (Sandbox Code Playgroud)

这是一个比较上下文,因此编译器可以告诉(隐式)0实际上是一个空指针常量,并使用正确的空指针值.这里没有任何诡计; 编译器以这种方式工作,并为两个构造生成相同的代码.空指针的内部表示无关紧要.


但是提到它可以表示为不包含全零的值.

是.真正.但在这种情况下,代表性并不重要:

当程序员请求一个空指针,通过编写0或者NULL,它是编译器的责任,产生任何位模式,该机采用该空指针.