Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 为什么此程序编译成功但运行失败? #包括 main() { int i=5; 如果(--i) { main(); printf(“%d”,i); }_C_Loops - Fatal编程技术网

C 为什么此程序编译成功但运行失败? #包括 main() { int i=5; 如果(--i) { main(); printf(“%d”,i); }

C 为什么此程序编译成功但运行失败? #包括 main() { int i=5; 如果(--i) { main(); printf(“%d”,i); },c,loops,C,Loops,请注意,如果我们将int i设为static,那么答案将是0000每次输入函数main()时,变量i的值为5(对main()的每次调用都拥有堆栈上该变量的自己的副本)。没有递归终止,因为递归终止的条件从未满足(即:--i的计算结果从未为零)。 因此,递归调用main(),直到堆栈上没有更多的位置 但是,如果将i声明为static,则对main()的所有调用都有一个变量i的共享副本。递归终止条件在--i求值为零时得到满足。i变量在每次函数main()时都有值5被输入(对main()的每次调用在堆栈

请注意,如果我们将
int i
设为
static
,那么答案将是
0000

每次输入函数
main()
时,变量
i
的值为5(对
main()
的每次调用都拥有堆栈上该变量的自己的副本)。没有递归终止,因为递归终止的条件从未满足(即:
--i
的计算结果从未为零)。 因此,递归调用
main()
,直到堆栈上没有更多的位置


但是,如果将
i
声明为
static
,则对
main()
的所有调用都有一个变量
i
的共享副本。递归终止条件在
--i
求值为零时得到满足。

i
变量在每次函数
main()时都有值5
被输入(对
main()
的每次调用在堆栈上拥有该变量的自己的副本)。没有递归终止,因为递归终止的条件从未满足(即:
--i
的计算结果从未为零)。 因此,递归调用
main()
,直到堆栈上没有更多的位置


但是,如果将
i
声明为
static
,则对
main()
的所有调用都会有一个变量
i
的共享副本。当
--i
的计算结果为零时,递归终止条件会得到满足。

因为它正在调用main(),所以会耗尽空间(在堆栈上)独立地

它耗尽了空间(在堆栈上),因为它正在独立地调用main()

代码本身是正确的,程序将无任何问题地编译。问题是条件
如果(--i)
将始终计算为true,因为每次递归调用
main
,都会创建一个新的本地
i
变量,它总是值
5
。当堆栈无法再增长时,程序将通过SIGSEGV终止。您可以通过Valgrind观察到这一点:

#include <stdio.h>
main()
{
int i=5;
    if(--i)
    {
        main();
        printf("%d ",i);
    }

当您将
i
声明为
static
变量时,程序输出
0000
的原因是
i
没有在每次
main
调用时重新声明。因此基本上
main
被递归调用,直到
i
0
为止。然后,所有堆叠的
printf
都被执行但是由于
i
0
在每个堆叠调用中,您将看到
0000
static
关键字使所有
main
调用实际上都引用相同的
i
变量,而不是副本。

代码本身是正确的,程序将毫无问题地编译。问题是条件
如果(--i)
将始终计算为true,因为每次递归调用
main
,都会创建一个新的本地
i
变量,它总是值
5
。当堆栈无法再增长时,程序将通过SIGSEGV终止。您可以通过Valgrind观察到这一点:

#include <stdio.h>
main()
{
int i=5;
    if(--i)
    {
        main();
        printf("%d ",i);
    }

当您将
i
声明为
static
变量时,程序输出
0000
的原因是
i
没有在每次
main
调用时重新声明。因此基本上
main
被递归调用,直到
i
0
为止。然后,所有堆叠的
printf
都被执行但是由于
i
0
在每个堆叠调用中,您将看到
0000
static
关键字使所有
main
调用实际上都引用了相同的
i
变量,而不是副本。

您不了解的是什么?递归还是静态变量?通过添加static,我得到0000,这是可以理解的,但问题是在循环中,终止条件不存在,现在我知道了。你可以在这里检查我的答案,当我们执行无限递归调用时会发生什么:类似于和。编译成功然后运行失败是正常行为。你不明白的是什么?递归还是静态变量?通过添加static,我得到0000,这是可以理解的,但问题是在循环中,终止条件不存在,现在我得到了。你可以在这里检查我的答案,当我们执行无限递归调用时会发生什么:类似于和。编译成功,然后运行失败是正常行为。