while(foo)vs while(foo!= NULL)

Mor*_*Man 3 c while-loop

有人可以解释while(foo)vs while(foo != NULL)是如何相同的?也:

while(!foo) VS while(foo == NULL)

我知道 !不是,但这就是我所知道的.

Kei*_*son 5

假设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)比较foo0,这相当于比较它为"零"的相应类型.while (foo)总是相当于while (foo != 0).对于浮点值,它也相当于while (foo != 0.0).对于字符值,它相当于while (foo != '\0').而且,正如我们所见,对于指针值,它相当于while (foo != NULL).

(在C中,如果条件为假,则比较运算符总是产生一个int0,1如果它是真的 - 但是通过隐式不等式比较为零,任何非零值都被视为真.)

[*] 空指针常量被定义为带有值的整数常量表达式0,或者这样的表达式转换为void*.空指针常量不一定是指针类型,但转换为指针类型会产生空指针值.比较指针值会0导致0隐式转换为指针类型,因此可以进行比较.