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)
将foo
与0
进行比较,这相当于将它与适当类型的“零”进行比较。 while (foo)
总是等于while (foo != 0)
。 对于浮点值,它也等于while (foo != 0.0)
。 对于字符值,它等同于while (foo != '\0')
。 而且,正如我们所见,对于指针值,它等同于while (foo != NULL)
。
(在C中,如果条件为假,则比较运算符始终产生int
值0
,如果为真,则总是产生1
– 但是通过隐式不等式比较为零,任何非零值都被视为true。)
[*] 空指针常量定义为值为0
的整型常量表达式,或者这样的表达式转换为void*
。 空指针常量不一定是指针类型,但将其转换为指针类型会产生空指针值。 将指针值与0
进行比较会导致0
被隐式转换为指针类型,因此可以进行比较。
while(foo);
和
while(foo != NULL)
等价只是因为NULL是一个扩展为0
或(void*)0
或0L
的宏,假设在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
在几个标准头文件中定义,它不是像if
和while
这样的关键字,你需要包含一个头文件来定义它以便能够使用它。 这个想法是当指针指向地址零时,它被称为“空指针”,这就是为什么它被称为NULL
,当你想说“零地址”而不仅仅是“零数字”时使用它。
编辑:正如Matt McNabb正确指出的, NULL
可以定义为0
或(void *)0
。 为了避免任何疑问,我引用了C11标准:
值为0的整型常量表达式或类型为void *的表达式称为空指针常量 。
后来
宏NULL在
(和其他头文件)中定义为空指针常量; 见7.19。
然后,在第7.19节:
3宏是
空值
它扩展为实现定义的空指针常量; 和
offsetof ( type , member-designator )
扩展到……
文字还在继续。 所以(void *)0
和0
是有效的实现定义的空指针常量。
while( expression
)只要expression
求值为任何非零值,就会重复封闭块。 当expression
evalutes为0时,while循环结束。
如果指针值不是std::nullptr
或NULL
,则指针类型的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或其他东西时)运行它。