为啥当我在条件中写“”时while循环有效
Posted
技术标签:
【中文标题】为啥当我在条件中写“”时while循环有效【英文标题】:Why while loop works when I write " " in the condition为什么当我在条件中写“”时while循环有效 【发布时间】:2021-08-20 13:35:47 【问题描述】:为什么这段代码的输出趋向于无穷大。输出是qwertyqwertyqwerty......
#include <stdio.h>
int main()
while(" ")
printf("qwerty");
return 0;
【问题讨论】:
因为" "
是一个不为NULL 的指针。与while(1)
相同。你期待什么?
您预计它会循环多少次?您使用的是一个常数值,因此它要么为零,要么为无穷大。
这是一个指针,它的 (" ") 值是什么?
Any 字符串文字将衰减为指向其位置的指针,如前所述,它不会是NULL
。字符串的 content 不相关。
如果要查看值,请使用printf("%p", " ")
【参考方案1】:
即使while("")
也是一个无限循环。在 C 中,所有字符串文字都被隐式视为指向字符串常量的指针。 ""
将是内存中某处的数据的一个字节部分(隐含的 \0
终止符本身),如果您评估它,您将获得它的地址。
" "
和 ""
的解释取决于您使用的语言。尤其是因为许多语言(包括 javascript、Perl、php、Python)在条件子句中提供了隐式转换,并且其中许多语言也以不同的方式对待 " "
和 ""
。 C#、Java 和 Delphi 等其他语言不提供隐式对话。
C(因此也包括 C++)创建一个字符串文字,它被认为是 const char*
类型(指向常量数据的指针)。在条件子句中求值时,表达式始终为真。阅读更多内容:String literals - cppreference.com 和 while loop - cppreference.com。
“专业提示”:对于表达式的进一步实验,请考虑使用if
而不是while
。
【讨论】:
这也有效 while(main) ,这也导致了无穷大 @Prince 除了下面的评论,另一个答案:如果您在没有调用的表达式中使用函数名(即在它之后没有括号),则函数的address 它被当作值,并且由于现有函数的地址与NULL
不同,所以它总是被视为true。【参考方案2】:
字符串文字,例如" "
,表示一个字符数组(C 2018 6.4.5 6)。这个包含一个空格和一个空字符。
在while (" ")
中使用时,此数组会自动转换为指向其第一个元素的指针(C 2018 6.3.2.1 3)。 (只要在表达式中使用数组,除了作为sizeof
的操作数、一元&
的操作数或作为用于初始化数组的字符串字面量之外,就会发生这种转换。)
while
语句迭代直到其控制表达式比较等于 0 (C 2018 6.8.5.1 4)。
一个指针比较等于零,实际上是一个空指针,只有当它是一个空指针时(C 2018 6.5.9 6)。
由于字符串字面量产生的指针指向初始空格字符,因此它不是空指针,并且它永远不会与零相比较。所以循环永远迭代。
【讨论】:
这也有效 while(main) ,这也导致无穷大 @Prince:main
是一个函数指示符。函数指示符会自动转换为函数指针,因此 main
变为 &main
。仅当指针为空指针时,将指针与零进行比较才会评估为真。 &main
不是空指针。
@Wolf:我引用的官方版本不能在线获得,除非通过付款(并且无法链接),我不想将官方版本的引用链接到非官方草稿。
@Wolf:我不想将官方版本的引用链接到非官方草稿。我之前说过这个意见,不明白你为什么再次要求它。以上是关于为啥当我在条件中写“”时while循环有效的主要内容,如果未能解决你的问题,请参考以下文章