#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。
怎么会发生这种情况?
答案 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);
}