在C和C++中为NULL/false,大于0x0/0b0 /'\ 0'/ 0

Cur*_*Sid 4 c c++ null

正如问题所述,我一直在使用NULL和false(在C++中)与0或0x0交替使用,依此类推.我很想知道除了是0的同义词之外他们是否有任何特殊意义.

MOH*_*MED 5

对于某些平台NULL不是0x0


C中的NULL是否需要/定义为零?:

NULL保证为零,也许保证为(void *)1.

C99,§6.3.2.3,3

带有值的整型常量表达式0或类型转换为类型的表达式 void *称为空指针常量.(55)如果将空指针常量转换为指针类型,则保证结果指针(称为空指针)比较不等于指向任何对象或函数的指针.

注55说:

55)宏NULL在<stddef.h>(和其他头部)中定义为空指针常量.

请注意,由于如何制定空指针的规则,用于分配/比较空指针的值保证为零,但实际存储在指针内的位模式可以是任何其他东西(但AFAIK只有少数很多)深奥的平台利用了这个事实,这不应该是一个问题,因为要"看到"你应该进入UB -land 的基础位模式无论如何).


因此,就标准而言,这两种形式是等价的(!ptr等同于ptr==0§6.5.3.35,ptr==0相当于ptr==NULL); if(!ptr)也是非常惯用的.

话虽如此,我通常会明确地编写,if(ptr==NULL)而不是if(!ptr)更清楚地表明我正在检查指针是否为null而不是某些布尔值.


  1. 请注意,在C++ void *中,由于更严格的隐式转换规则会导致使用这种NULL繁琐(您必须每次都明确地将其转换为比较指针的类型),因此无法使用强制转换.