c - while(foo) 与 while(foo != NULL)

标签 c while-loop

有人可以解释一下 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)foo0 进行比较,相当于将其与适当类型的“零”进行比较. while (foo) 始终等同于 while (foo != 0)。对于浮点值,它也等同于 while (foo != 0.0)。对于字符值,它等同于 while (foo != '\0')。而且,正如我们所见,对于指针值,它等同于 while (foo != NULL)

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

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

关于c - while(foo) 与 while(foo != NULL),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29337488/

相关文章:

java - 尝试使用 FileWriter 写入输出文件

c - 我如何创建一个与 C 游戏同时工作的计时器?

c - GNU 缩进 : which option puts function return type same line

c - 负载很大才出现的bug怎么调试?

java - while 循环中的代码行在错误的时间执行

c++ - 在 x 次循环后退出 while 循环

c - sqlite3 中查询问题之间的日期

c - 仅使用 C 中的循环回文

linux - 如何在shell脚本中添加缩进