有人可以解释 while(foo)
与 while(foo != NULL)
是如何等效的吗?还:while(!foo)
与 while(foo == NULL)
我知道 !不是,但这就是我所知道的。
最佳答案
假设 foo
是指针类型,while (foo)
和 while (foo != NULL)
是完全等价的。两者也等价于 while (foo != 0)
。 (在我看来 while (foo != NULL)
更清楚地表达了意图。)
在任何需要条件( if()
、 while()
、其他一些)的上下文中,如果条件比较不等于零,则表达式被视为真,如果比较等于零,则为假。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
隐式转换为指针类型,以便进行比较。