[英]Unpredictable output of recursion of main()
以下代码使用代码块将输出表示为0 0 0 0。
int main()
{
static int i=5;
if(--i){
main();
printf("%d ",i);
}
}
我完全理解上面的代码是如何执行的。 但是,当我从代码中删除“静态”并使用int = 5时,Ideone.com(在线编译器)给了我运行时错误,而Codeblocks(使用GCC)给了我什么-甚至终端没有弹出。
我也尝试将声明部分放在main之外,即static int i; 总的来说,我给了i = 5;。 不过,我仍然遇到上述错误。 我不知道发生了什么事。 任何帮助将不胜感激。
PS:该程序在网站上找到,没有给出解释。
如果删除该静态函数,则对main的每次调用都将获得其自己的i副本(已初始化为5),因此您的递归永远不会终止。
当在main()
外部声明static int i
并将其在main()
内部初始化为值5
时,执行时会出现问题。 第一次让if(4)
调用您的内部main()
并执行外部main()
使i
设置回5
使其进入无限循环,因此您看不到任何输出,因为您的if
永远不会失败,并且只有一种可能是if(4)
。
int main() // 1st main call
{
static int i=5;
if(--i){ // if(4), if(3), if(2), if(1)-> all four if's are true
// if(0) fails
main(); // 2nd main, 3rd main, 4th main, 5th main -> corresponding to
// above successful if's.
// When if(0), recursion ends, return
printf("%d ",i); // Now i is `0` and prints 4 zero's
}
}
如果删除static
,则在输出任何内容之前会得到无限递归。 递归导致堆栈溢出,并且程序崩溃。
static
意味着您始终对同一变量进行操作,因此可以从5-> 0开始计数。如果将其删除,则在每次调用时使用5对其进行初始化,并且if(4)
始终为true。 对于static
它仅初始化一次。
当使用静态printf时将显示4,3,2,1并且递归将结束。
当不使用静态时,理论上(如果程序可以运行),printf将显示4,4,4,4 ..并且递归将永远不会结束。
您的代码没有问题。 情况1:如果您编写,它将给您输出0000,这是因为您正逐渐减小i的值。 变为0时。如果condition为false,它将四次打印0。
int main()
{
static int i=5;
if(--i){
main();
printf("%d ",i);
}
}
情况2:
但是,如果删除了静态变量,则在每个递归调用中都将创建一个新变量i,该变量每次将占用2个字节并消耗内存(在堆栈中)。 一旦堆栈已满,它将提示运行时错误,程序将崩溃。 http://ideone.com的在线编译器处理后端的运行时错误,以使您的程序不会崩溃。这就是为什么您遇到运行时错误。 和预期的答案。
情况3:
当您在外部声明变量时,例如
static int i;
int main()
{
i=5;
if(--i){
main();
printf("%d ",i);
}
}
在这种情况下,它将再次超过内存限制。 在这里,每次将5分配给i时,main()都会占用堆栈空间,再次导致程序崩溃。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.