有人可以解释一下 while(foo)
与 while(foo != NULL)
是等价的吗?还有:
while(!foo)
与 while(foo == NULL)
我知道!不是,但这就是我所知道的。
最佳答案
假设foo
是指针类型,while (foo)
和while (foo != NULL)
是完全等价的。两者也等同于 while (foo != 0)
。 (在我看来 while (foo != NULL)
更清楚地表达了意图。)
在任何需要条件的上下文中(if()
、while()
等),表达式被视为 true如果条件比较不等于零,则假如果比较等于零。
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
隐式转换为指针类型,以便进行比较。
关于c - while(foo) 与 while(foo != NULL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29337488/