繁体   English   中英

main()的递归的不可预测的输出

[英]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.

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