有人可以解释while(foo)
与while(foo != NULL)
的对等关系吗?也:
while(!foo)
vs while(foo == NULL)
我知道!不是,但这就是我所知道的全部。
答案 0 :(得分: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)
将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
被隐式转换为指针类型,因此可以进行比较。
答案 1 :(得分:2)
while(foo);
和
while(foo != NULL)
仅仅是因为NULL是一个扩展为0
或(void*)0
或0L
的宏,因为在C 0中的计算结果为false(并且任何非零数字为是的)然后
while(foo); //while foo isn't 0
while(foo != NULL) //expands to while(foo != 0) < while foo isn't 0
答案 2 :(得分:1)
NULL
是符号常量,您可以将其视为一种替换文本。 NULL
只是编译器稍后用零替换的内容,因此编写while (foo != NULL)
与编写while (foo != 0)
相同。请记住,==
如果左侧的内容等于右侧的内容,则表示“是”,而!=
则表示“是”。它的左边不等于右边的那个。
在C中,数字0始终表示错误,其他每个数字表示正确。因此while (foo != 0)
与说&#34;在foo为真时运行此循环中的代码&#34;。例如,while (1)
与说&#34;永远运行此循环中的代码&#34;相同,因为1是一个始终不为零的数字,因此始终为真。
在C中,如果您只使用foo
,其中预期会出现真假类型,那么它与foo != 0
一样,那就是{就像你可以使用的快捷方式一样,它与询问&#34; foo是否真实相同?&#34;。 !
表示&#34;不是&#34;,所以要求!foo
与询问相同&#34; foo不是真的?&#34;,换句话说&#34;是foo假?&#34 ;.这意味着while (!foo)
与&#34相同;当foo为false&#34;时,在此循环中运行代码,这与while (foo == 0)
相同,因为零表示false,这与while (foo == NULL)
,因为NULL
表示零。
可以这样想:循环中的代码只有在括号中的内容为真(即非零)时才会运行。所以在while (foo)
中,计算机会询问&#34; foo是非零?&#34;如果是,则循环继续。现在,如果你有while (!foo)
,计算机会询问&#34; foo不是非零?&#34;如果是,则循环继续。仅当括号中的表达式导致false时,循环才会停止。
NULL
在几个标准头文件中定义,它不是像if
和while
这样的关键字,您需要包含一个头文件来定义它才能够使用它。这个想法是当指针指向地址零时,它被称为&#34;空指针&#34;,这就是为什么它被称为NULL
,它&#39 ;当你想说'#34;零地址&#34;而不是仅仅#&#34;将数字归零&#34;。
修改强>
正如Matt McNabb正确指出的那样,NULL
可以定义为0
或(void *)0
。为了避免任何疑问,我引用了C11标准:
值为0的整型常量表达式,或者类型为 void * 的表达式,称为空指针常量。
后来
宏 NULL 在&lt; stddef.h&gt; (和其他标题)中定义为空指针常量;见7.19。
然后,在第7.19节:
3宏是
<强> NULL 强>
扩展为实现定义的空指针常量;和
offsetof ( type , member-designator )
扩展为......
文字还在继续。所以(void *)0
和0
是有效的实现定义的空指针常量。
答案 3 :(得分:0)
while(expression
)只要expression
求值为任何非零值,就会重复封闭块。当expression
评估为0时,while循环结束。
如果指针值不是expression
或std::nullptr
,则NULL
指针类型被视为非0。
!
运算符是布尔值not
运算符。
因此
while (foo)
和
while (foo != NULL)
在逻辑上彼此相同。因此,两者的逻辑倒数也相互等同。
答案 4 :(得分:0)
while循环可以像这样运行:
while(1) //This will run forever.
while(true) //This will run forever.
NULL
就像0,所以如果你有while(foo != NULL)
,那就说虽然(foo不等于0,所以当它等于1或其他东西时)运行它。 / p>