繁体   English   中英

为什么将 while() 中的 printf() 作为条件打印不同的 output

[英]Why printf() in while() as a condition prints different output

第一个代码

#include<stdio.h>
int main()
{
    while(printf("Hello"))
    return 0;
}

仅产生Hello作为 output

第二个代码

#include<stdio.h>
int main()
{
    while(printf("Hello"));
    return 0;
}

第二个代码无限次打印Hello

第三个代码

#include<stdio.h>
int main()
{
    while(printf("Hello"))
    {}
    return 0;
}

第三个代码也无限次打印Hello

使用的编译器 - GCC 9.0.1

为什么会这样?

while结束后有一个语句)

6.8.6 迭代语句

 iteration-statement:
                while ( expression ) statement

 ....

while(printf("Hello"))
    return 0;

该语句(基本上是while的参数)是return 0; ( 6.8.6 )

while(printf("Hello"));

声明是; (一个空的(null)/表达式语句( 6.8.3 ))。

while(printf("Hello")){}

它是一个空的复合语句( {}6.8.2 ),在语义上等同于; .

您的代码片段是误导性空白的示例——空白使人类对事物的理解与编译器不同。

较少误导的渲染将是:

while(printf("Hello"))
    return 0;

,

while(printf("Hello"))
    ; //or perhaps a {} instead of the null statement

while(printf("Hello"))
    {}

printf返回打印的字符数(即 5)。 任何非零数的计算结果为真。 所以循环是一个无限循环。

rest 取决于循环中发生的情况。 在第二种和第三种情况下,循环是空的(不包含语句),因此它们继续执行

在第一种情况下, return 0在循环内执行。 Return 将控制流中断循环,导致循环(在这种情况下是程序)停止执行

在您的第一个代码段中, return 0; 语句是while循环“主体”的一部分; 实际上,它是整个主体,因此,在第一次运行该循环时,程序退出(因为return 0;main中执行时会退出)并且循环因此突然终止。

在第二个和第三个片段中,循环体为,但这并不妨碍它运行,因为printf("Hello") function 调用将返回 output 的字符数 - 这将是非零,因此被解释为“真”。

在第一个中, while的主体是return 0 ,因此它将在第一次迭代后返回。 同时与其他两个版本是相同的,有一个空的身体,所以他们无限地继续无所事事,但条件是不断评估将打印“你好”。

    while(printf("Hello"))
    return 0;

    while(printf("Hello"))
    {
        return 0;
    }

第一个代码:

printf("Hello")返回字符数。

当在 while 循环中使用printf("Hello")时,它将打印Hello并返回 5。

由于它大于 0 while循环认为这是真的,并执行 while 下面的语句,即return 0

return 0使main function 返回 0 并停止执行。

编码

while(printf("Hello"))
    return 0;

while(printf("Hello"))
{
    return 0;
}

第二个代码:

既然你用过; while()之后,不会执行后面的语句; . 所以语句return 0没有被执行, while检查条件无限次打印无限Hello

第三个代码:

While 将仅在{ }内执行语句。

由于每次搜索语句后它都是空的,它会返回 go 并检查条件。

由于条件始终为真,它不会达到return 0 ,它将无限次打印Hello

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM