为啥当我在条件中写“”时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 的操作数、一元&amp; 的操作数或作为用于初始化数组的字符串字面量之外,就会发生这种转换。)

while 语句迭代直到其控制表达式比较等于 0 (C 2018 6.8.5.1 4)。

一个指针比较等于零,实际上是一个空指针,只有当它是一个空指针时(C 2018 6.5.9 6)。

由于字符串字面量产生的指针指向初始空格字符,因此它不是空指针,并且它永远不会与零相比较。所以循环永远迭代。

【讨论】:

这也有效 while(main) ,这也导致无穷大 @Prince:main 是一个函数指示符。函数指示符会自动转换为函数指针,因此 main 变为 &amp;main。仅当指针为空指针时,将指针与零进行比较才会评估为真。 &amp;main 不是空指针。 @Wolf:我引用的官方版本不能在线获得,除非通过付款(并且无法链接),我不想将官方版本的引用链接到非官方草稿。 @Wolf:我不想将官方版本的引用链接到非官方草稿。我之前说过这个意见,不明白你为什么再次要求它。

以上是关于为啥当我在条件中写“”时while循环有效的主要内容,如果未能解决你的问题,请参考以下文章

java基础知识—循环结构

python学习之while循环

Js 循环结构

while循环随笔

Python while循环语句

While 循环与 || 一起使用但不是&&,不明白为啥?