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

时间:2015-03-30 02:27:49

标签: c while-loop

有人可以解释while(foo)while(foo != NULL)的对等关系吗?也:

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

我知道!不是,但这就是我所知道的全部。

5 个答案:

答案 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)foo0进行比较,这相当于将其与"零"进行比较。适当的类型。 while (foo)始终等同于while (foo != 0)。对于浮点值,它也等同于while (foo != 0.0)。对于字符值,它等同于while (foo != '\0')。而且,正如我们所见,对于指针值,它等同于while (foo != NULL)

(在C中,如果条件为假,则比较运算符始终生成int0,如果条件为真则为1 - 但任何非零值通过将隐式不等式比较归零,将值视为真。)

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

答案 1 :(得分:2)

while(foo);

while(foo != NULL)

仅仅是因为NULL是一个扩展为0(void*)00L的宏,因为在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在几个标准头文件中定义,它不是像ifwhile这样的关键字,您需要包含一个头文件来定义它才能够使用它。这个想法是当指针指向地址零时,它被称为&#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 *)00是有效的实现定义的空指针常量。

答案 3 :(得分:0)

while(expression)只要expression求值为任何非零值,就会重复封闭块。当expression评估为0时,while循环结束。

如果指针值不是expressionstd::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>