For-loop中的多个printf作为初始化、条件和更新的一部分

Posted

技术标签:

【中文标题】For-loop中的多个printf作为初始化、条件和更新的一部分【英文标题】:Multiple printf in the For-loop as part of the initialization, condition and update 【发布时间】:2022-01-02 09:14:46 【问题描述】:

谁能向我解释为什么它会打印 32 以及它是如何工作的总体概念?

#include <stdio.h>

int main()

    int a=1;
    for (printf ("3"); printf ("2"); printf ("1"))

    return 0;

【问题讨论】:

这是一个故意混淆的代码。不是说太难理解,而是为什么呢? 如果你缩进第 8 行(倒数第一行),就会有线索。 @EugeneSh.:人们应该研究有意混淆的代码的一个原因是培养分析无意混淆代码所需的技能。人类会犯错误,有时很难在代码中看到错误。如果您只练习使用看起来不错的代码,以便您的概念与代码的预期含义看起来一致,那么您并没有提高识别错误所需的技能导致代码做一些超出预期的事情。重要的是要善于识别代码实际表达的内容,而不是其外观。 @EricPostpischil 还有助于理解编译文件的反汇编,这很丑陋,尤其是没有像 .pdb 这样的文件方便 【参考方案1】:

适当的缩进会让它更清晰:

#include <stdio.h>

int main()

    int a=1;
    for (printf ("3"); printf ("2"); printf ("1"))
        return 0;

所以会发生以下情况:

a 被初始化为 1。我不知道为什么这个变量存在,因为它从未使用过。 for 执行其初始化语句 printf("3");。这将打印3for 评估其重复条件 printf("2")。这将打印2 并返回打印的字符数,即1。 由于条件为真,它进入循环体。 主体执行return 0;。这会从main() 返回,从而结束循环。

由于循环结束,我们永远不会计算更新表达式printf("1"),因此它永远不会打印1。而且我们不会重复任何事情。

【讨论】:

【参考方案2】:

要知道,如果没有无限循环,程序从函数main()的左边''开始运行,到函数main()的右边''结束。

正如您的代码所示,您的困难在于理解 C 语言中 for 循环的流程图。

如你所见,for循环的语法是:
for (initializationStatement; testExpression; updateStatement)

    // statements inside the body of loop
    for loop body;

for 循环是如何工作的?

1.初始化语句只执行一次。

2.然后,评估测试表达式。如果测试表达式被评估为假,则 for 循环终止。

3.但是,如果测试表达式的计算结果为真,则执行 for 循环体内的语句,并更新更新表达式。

4.再次评估测试表达式。

这个过程一直持续到测试表达式为假为止。当测试表达式为假时,循环终止。

那么,for循环流程图

首先,以你的代码为例:
#include <stdio.h>
int main()
    for (printf ("3"); printf("2"); printf("1")) break;
    return 0;

输出
32

1.初始化为"printf ("3")",那么,打印:

3

2.测试表达式"printf("2")",总是正确的,所以打印:

2

3.for body循环break,表示结束for循环的执行,

不执行更新后的表达式"printf("1")"

另外,程序跳出for循环,跳转到"return 0;",

那么,结束这个程序的执行。

所以,输出是

32
其次,以你修改后的代码为例:
#include <stdio.h>
int main()
    for (printf ("3"); printf("2"); printf("1")) ;
    return 0;

输出
321212121212121212...121212...1212...

同样,

1.初始化为"printf ("3")",那么,打印:

3

2.测试表达式"printf("2")",总是正确的,所以打印:

2

3.for body loop "``",为空,则什么也不做。转到更新的表达式

printf("1")

4.更新后的表达式"printf("1")",然后,打印

1

5.然后,转到测试表达式printf("2"),即“2.The test

表达式"printf("2")",那总是正确的,所以打印"。因为

循环体为"``",为空,则总是从更新后跳转

表达式 "printf("1")" 到测试表达式 "printf("2")",

这就是为什么在打印“32”之后该函数会打印无限循环

12”。而且,该功能永远不会停止打印“12”,除非您

停止该功能。

所以,所以,所以输出是

32121212...121212...121212...
第三,以你最近修改的代码为例:
#include <stdio.h>

int main()

    int a=1;
    for (printf ("3"); printf ("2"); printf ("1")) 

    return 0;

输出
32

1.程序从函数main()的左边''开始运行,

这是临时变量的初始化语句

"int a=1;".

该语句定义了一个“int”类型的临时变量“a”,并且

将它的值设置为“1”,但是什么都不打印!

2.然后,程序进入for循环。

3.初始化语句为"printf ("3")",然后,打印

3”,和

转到测试表达式。

3

4. 测试表达式"printf("2")",总是正确的,所以

打印“2”,然后转到 for 循环体表达式。

2

5.for循环体表达式“return 0”,表达式

"return 0"将'0'返回给main()函数,结束

main() 的执行,但是什么也不打印。

所以,输出是:

32
结束。谢谢!

【讨论】:

以上是关于For-loop中的多个printf作为初始化、条件和更新的一部分的主要内容,如果未能解决你的问题,请参考以下文章

如何在多个异步调用中向 NodeJS 中的数据库发送响应?

Excel VBA:错误 Goto 语句在 For-Loop 中不起作用

我想将'for-loop'的结果保存为python中的文本文件

BATCH FOR-loop,但从特定文件开始

Matlab求解具有多个初始条件的 ODE 系统

HTTP/2:stream.end 使用 For-Loop