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

时间:2014-08-27 16:33:23

标签: c recursion

以下代码使用Codeblocks将输出设为0 0 0 0。

int main()
{
 static int i=5;
 if(--i){
    main();
    printf("%d ",i);
 }   
}

我完全理解上面的代码是如何执行的。但是,当我删除静态'从代码和使用int i = 5,Ideone.com(在线编译器)给了我运行时错误和Codeblocks(使用GCC)没有给我任何 - 甚至终端没有弹出。

我也尝试将声明部分放在main之外,即static int i;在主要的,我然后给了i = 5;。不过,我收到了上述错误。我不知道发生了什么。任何帮助将不胜感激。

PS:该程序是在网站上找到的,没有给出任何解释。

5 个答案:

答案 0 :(得分:4)

如果删除静态,每次调用main都会得到自己的i副本,初始化为5,所以你的递归永远不会终止。

答案 1 :(得分:1)

当您在static int i之外声明main()并在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 
  }   
}

答案 2 :(得分:0)

如果删除static,则在输出任何内容之前会得到无限递归。递归导致堆栈溢出,程序崩溃。

static表示您始终对同一个变量进行操作,因此您可以从5开始计算 - > 0.如果删除它,则在每次调用5时初始化它,if(4)始终为true。 使用static时,它只会初始化一次。

答案 3 :(得分:0)

当使用静态printf时将显示4,3,2,1并且递归将结束。

当不使用静态时,理论上(如果程序会运行)printf将显示4,4,4,4 .. 递归永远不会结束。

答案 4 :(得分:0)

您的代码没有问题。 情况1: 如果你写,它会给你输出0000因为你正在递减i的值。一旦它变为0.如果条件为假,它将打印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()将占用堆栈空间,再次程序崩溃。