无法解释程序的输出

时间:2014-09-29 20:45:15

标签: c

#include <stdio.h>
#include <string.h>

void main()
{
  static int a=1;
  ++a;
  printf("%d",a);
  if(a<=3)
      main();
   printf("%d,a");   

}

我无法理解为什么o / p是:234444。任何人都可以解释一下吗?

根据我的说法,一旦值达到4就应该是2344,如果是条件则应该失败并且不会再次调用main。

怎么会发生这种情况?

4 个答案:

答案 0 :(得分:3)

这样的事情:

- main()
- ++a, now == 2
- print 2
  - main()
  - ++a, now == 3
  - print 3
    - main()
    - ++a, now == 4
    - don't call main
    - print 4
    - return
  - print 4
  - return
- print 4
- return

答案 1 :(得分:2)

三个main的输出是:

main #1: 2         4
main #2:   3     4
main #3      4 4

BTW,printf("%d,a");应为printf("%d",a);

为了说明这一点,请尝试

int depth = 0;

void main()
{
    ++depth;

    static int a = 1;
    ++a;
    printf("%d:%d ", depth, a);
    if (a <= 3)
        main();
    printf("%d:%d ", depth, a);

    --depth;
}

输出:

1:2 2:3 3:4 3:4 2:4 1:4

答案 2 :(得分:1)

main()的每次运行通过在递归调用之后输出a的值来完成。该功能将运行三次;第一次运行将输出2,然后递归,然后输出4。在两者之间,另一个调用将输出3,然后递归,然后输出4。在两者之间,花药调用将输出4,然后递归,然后输出4

我见过这样的代码的唯一地方是完全人为的编码测试,在那里你被要求确定荒谬的东西的输出。这是从哪里来的? 不要浪费你的时间来处理这些事情:没有人应该编写这样的代码,并且能够弄清楚它的行为方式并不是编程能力的良好指标。

答案 3 :(得分:0)

你将一个变量“a”声明为静态,所以当你输入main()时,该值不再被初始化,并保持不变,否则你会得到一个无限循环和堆栈溢出:) 这里很有意思:

void main(int a)
{
    ++a;
    printf("%d\n", a);
    if(a<=3)
        main(a);
    printf("%d\n", a);   
}