代码之家  ›  专栏  ›  技术社区  ›  Kraken

方案产出

  •  0
  • Kraken  · 技术社区  · 15 年前
    #include<stdio.h>
    
    void f(void)
    {
        int s = 0;
        s++;
        if(s == 10)
            return;
        f();
        printf("%d ", s);
    }
    int main(void)
    {
        f();
    }
    

    这个节目的结果是什么!??

    10 回复  |  直到 15 年前
        1
  •  4
  •   BoltClock    15 年前

    这里的问题是你没有静态初始化 s 总是 f() ,和 if(s == 10) 从未见过。调用堆栈最终溢出并发出隆隆声,出现分段错误。

        2
  •  6
  •   Naveen    15 年前

    s 是一个局部变量,每次递归调用 f() 获取它自己的副本。所以每次 s

        3
  •  2
  •   Nathan Fellman    15 年前

    f 递归地,每次都不改变任何东西。你可能得到一个堆栈溢出。

    f ,初始化 s 0

    你应该做的是 一个参数 f s

        4
  •  1
  •   Carl Norum    15 年前

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

        5
  •  1
  •   Sachin Midha    15 年前

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

        6
  •  0
  •   Praveen S    15 年前

    让你的变量是静态的怎么样?

        7
  •  0
  •   js1568    15 年前

    这是一个调用自身的递归函数。然而,这是一个无限循环,因为 int s = 0; 每次调用计数器时重置计数器。它会打印出无数的0。

    样品溶液:

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

    我不擅长C语法,但这个想法是正确的。

        8
  •  0
  •   karpathy    15 年前

    无限循环。这里可能有一些类似于你想要的

    #include<stdio.h>
    
    void f(int s)
    {
        s++;
        if(s == 10)
            return;
        f(s);
        printf("%d ", s);
    }
    int main(void)
    {
        f(0);
    }
    
        9
  •  0
  •   Starkey    15 年前

    这可能是一个更有趣的程序:

    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

        10
  •  0
  •   Alexander Pogrebnyak    15 年前

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

    正如其他人所建议的,你应该申报 s static int s = 0