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

有人可以解释while(foo) vs while(foo != NULL)是如何相等的吗? 也:

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

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

假设foo是指针类型, while (foo)while (foo != NULL)完全相同。 两者也等同于while (foo != 0) 。 (在我看来while (foo != NULL)更清楚地表达了意图。)

在任何需要条件的上下文中( if()while() ,其他几个),如果条件比较不等于零,则表达式被视为true ,如果它比较等于零则表示false

NULL是一个扩展为实现定义的空指针常量的宏。 将指针值与NULL进行比较会产生空指针的true值,任何非空指针的false值。

常量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 – 但是通过隐式不等式比较为零,任何非零值都被视为true。)

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

 while(foo); 

 while(foo != NULL) 

等价只是因为NULL是一个扩展为0(void*)00L的宏,假设在C 0中求值为false(并且任何非零数字为true)则

 while(foo); //while foo isn't 0 while(foo != NULL) //expands to while(foo != 0) < while foo isn't 0 

NULL是一个符号常量 ,您可以将其视为一种替换文本。 NULL只是编译器稍后用零替换的东西,因此写入while (foo != NULL)与写入while (foo != 0)相同while (foo != 0) 。 记住, ==如果左侧的内容等于右边的内容,则表示“是”,而!=如果左侧的内容不等于右侧的内容,则表示“是”。

在C中,数字0总是表示错误,其他每个数字表示正确。 因此, while (foo != 0)与说“在foo为真时在此循环中运行代码”相同。 例如, while (1)与“永远在此循环中运行代码”相同,因为1是一个始终与零不同的数字,因此始终为真。

在C语言中,如果你只使用foo表示一个真或假类型的值,它就像说foo != 0 ,这就像你可以使用的快捷方式一样,就像问“foo是真的”一样?”。 ! 意思是“不”,所以问!foo和问“foo not true?”相同,换句话说“foo false?”。 这意味着while (!foo)与“在foo为false时运行此循环中的代码”相同,这与while (foo == 0)相同,因为零表示false,这与while (foo == NULL)相同while (foo == NULL)因为NULL表示零。

可以这样想:循环中的代码只有在括号中的内容为真(即非零)时才会运行。 所以在while (foo) ,计算机会询问“foo非零?”,如果是,则循环继续。 现在,如果你有while (!foo) ,计算机会询问“foo not not zero?”,如果是,则循环继续。 仅当括号中的表达式导致false时,循环才会停止。

NULL在几个标准头文件中定义,它不是像ifwhile这样的关键字,你需要包含一个头文件来定义它以便能够使用它。 这个想法是当指针指向地址零时,它被称为“空指针”,这就是为什么它被称为NULL ,当你想说“零地址”而不仅仅是“零数字”时使用它。

编辑:正如Matt McNabb正确指出的, NULL可以定义为0(void *)0 。 为了避免任何疑问,我引用了C11标准:

值为0的整型常量表达式或类型为void *的表达式称为空指针常量

后来

NULL (和其他头文件)中定义为空指针常量; 见7.19。

然后,在第7.19节:

3宏是

空值

它扩展为实现定义的空指针常量; 和

offsetoftypemember-designator

扩展到……

文字还在继续。 所以(void *)00是有效的实现定义的空指针常量。

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

如果指针值不是std::nullptrNULL ,则指针类型的expression被认为是非0。

! operator是一个布尔运算符。

因此

  while (foo) 

  while (foo != NULL) 

在逻辑上彼此相同。 因此,两者的逻辑逆也相互等效。

while循环可以像这样运行:

 while(1) //This will run forever. while(true) //This will run forever. 

NULL就像0,所以如果你有while(foo != NULL) ,这就是说while(foo不等于0,所以当它等于1或其他东西时)运行它。