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.
当C需要表达式的布尔值时,当表达式比较等于零时推断出false值,否则推断为true值.也就是说,无论什么时候写
Run Code Online (Sandbox Code Playgroud)if(expr)
expr任何表达式都在哪里,编译器本质上就像它被写成一样Run Code Online (Sandbox Code Playgroud)if((expr) != 0)用平凡的指针表达式
p代替expr,我们有Run Code Online (Sandbox Code Playgroud)if(p) is equivalent to if(p != 0)这是一个比较上下文,因此编译器可以告诉(隐式)
0实际上是一个空指针常量,并使用正确的空指针值.这里没有任何诡计; 编译器以这种方式工作,并为两个构造生成相同的代码.空指针的内部表示无关紧要.
但是提到它可以表示为不包含全零的值.
是.真正.但在这种情况下,代表性并不重要:
当程序员请求一个空指针,通过编写
0或者NULL,它是编译器的责任,产生任何位模式,该机采用该空指针.