有人可以解释 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)foo0 进行比较,这相当于将其与适当类型的“零”进行比较。 while (foo) 总是等价于 while (foo != 0) 。对于浮点值,它也等效于 while (foo != 0.0) 。对于字符值,它相当于 while (foo != '\0') 。而且,正如我们所见,对于一个指针值,它等价于 while (foo != NULL)

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

[*] 空指针常量定义为值为 0 的整数常量表达式,或转换为 void* 的此类表达式。空指针常量不一定是指针类型,但将其转换为指针类型会产生空指针值。将指针值与 0 进行比较会导致 0 隐式转换为指针类型,以便进行比较。

10-06 05:22
查看更多