有人可以解释while(foo)vs while(foo != NULL)是如何相同的?也:
while(!foo) VS while(foo == NULL)
我知道 !不是,但这就是我所知道的.
假设foo是指针类型,while (foo)并且while (foo != NULL)完全等效.两者都相当于while (foo != 0).(在我看来,while (foo != NULL)更清楚地表达了意图.)
在任何需要条件(或其他一些条件)的上下文中if(),如果条件比较不等于零,则while()表达式被视为true,如果条件比较等于零则表示为false.
NULL是一个宏,它扩展为实现定义的空指针常量.比较指针值以NULL产生空指针的真值,为任何非空指针的假值.
常量0是空指针常量[*].(这并不意味着空指针具有相同的位表示0x00000000或类似的东西,尽管它经常这样做;这意味着0 源代码中的常量可以表示空指针.)正如您所期望的那样,比较指针值到一个空指针常量告诉你该指针是否是一个空指针.在while (foo),与零的比较是隐式的 - 但它仍然测试是否foo是空指针.
更一般地,while (foo)比较foo到0,这相当于比较它为"零"的相应类型.while (foo)总是相当于while (foo != 0).对于浮点值,它也相当于while (foo != 0.0).对于字符值,它相当于while (foo != '\0').而且,正如我们所见,对于指针值,它相当于while (foo != NULL).
(在C中,如果条件为假,则比较运算符总是产生一个int值0,1如果它是真的 - 但是通过隐式不等式比较为零,任何非零值都被视为真.)
[*] 空指针常量被定义为带有值的整数常量表达式0,或者这样的表达式转换为void*.空指针常量不一定是指针类型,但将其转换为指针类型会产生空指针值.比较指针值会0导致0隐式转换为指针类型,因此可以进行比较.