程序的输出

时间:2010-08-26 17:40:03

标签: c recursion

#include<stdio.h>

void f(void)
{
    int s = 0;
    s++;
    if(s == 10)
        return;
    f();
    printf("%d ", s);
}
int main(void)
{
    f();
}

程序的输出是什么!?? 我是分段错误......它是什么?

10 个答案:

答案 0 :(得分:6)

由于s是一个局部变量,因此每次递归调用f()都会得到它自己的副本。因此每次s为1时,您都会遇到堆栈溢出异常。

答案 1 :(得分:4)

这里的问题是你没有静态初始化s。因此,每次拨打f()时,始终都会从0开始,并且f()一直反复调用自己,但永远不会遇到if(s == 10)。调用堆栈最终溢出并繁荣,分段错误。

答案 2 :(得分:2)

问题是你递归地调用f,而不是每次都改变任何东西。你可能正在堆栈溢出。

每次拨打f时,都会将s初始化为0并将其递增。它永远不会达到10。

您应该做的是s参数f或者s静态。

答案 3 :(得分:1)

你的程序是一个无限循环;你得到了分段错误,因为你最终会溢出你的堆栈。

答案 4 :(得分:1)

程序进入无限循环。 原因是: s是f()的局部,所以每当调用f()时,s被初始化为0.然后它增加1,&amp;再次调用f()。这一次,f()使用其本地副本&amp;将s初始化为0&amp;再次递归调用f()。这会产生一个无限循环&amp;程序生成分段错误。由于递归无限调用,seg错误的原因是堆栈溢出。 要解决这个问题,要么是静态的,要么是全局的,而不是本地的。

答案 5 :(得分:0)

如何使变量静止?

答案 6 :(得分:0)

这是一个自我调用的递归函数。但是,它是一个无限循环,因为int s = 0;每次调用时都会重置计数器。它将打印出无穷无尽的0行。

样本解决方案:

int main (void) {
   f(0);
}

void f (int s) {
   if (s == 10)
      return;
   printf("%d ", s);
   f(s++);
}

我对C语法不太满意,但这个想法很合理。

答案 7 :(得分:0)

无限循环。这可能类似于你想要的东西

#include<stdio.h>

void f(int s)
{
    s++;
    if(s == 10)
        return;
    f(s);
    printf("%d ", s);
}
int main(void)
{
    f(0);
}

答案 8 :(得分:0)

这可能是一个更有趣的计划:

void f(int s)
{
  s++;
  if(s == 10)
    return;
  f(s);
  printf("%d ", s);
}

int main(void) 
{
  f(0);
}

那将打印:

9 8 7 6 5 4 3 2 1

答案 9 :(得分:0)

此程序的输出是此站点的名称。

正如其他人所建议您应将s声明为static int s = 0