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,这是可以理解的,但问题是在循环中,终止条件不存在,现在我得到了。你可以在这里检查我的答案,当我们执行无限递归调用时会发生什么:类似于和。编译成功,然后运行失败是正常行为。