zhumengyun 发表于 2014-8-12 14:31:45

退出递归函数的过程

#include<stdio.h>
void updown (int);
int main(void)
{
        updown(1);

}

void updown (int n)
{

        printf("%d,%p\n",n,&n);
        if(n<4)
                updown(n+1);
printf("%d,%p\n",n,&n);/*打印结果为什么是4,3,2,1的顺序*/
printf("***\n");       /*为什么在推出递归的过程中也会执行这一句*/
}
结果是
10018FEF4
20018FE9C
30018FE44
40018FEEC
40018FEEC
***
30018FE44
***
20018FE9C
***
10018FEF4
***
为什么在推出递归时,会执行printf("***\n");语句呢,(事实上printf("%d,%p\n",n,&n);后的语句都会执行)

小靚同学Leon 发表于 2014-8-12 17:39:00

我调试了下代码,printf("***\n")这句执行完后,程序并不回main函数,而是跳至updown(n+1),n自减,酱紫再循环3次输出后,跳回main函数。必须将n减为1才能跑回main函数。至于为什么我还没搞清楚,但是实际调试就是酱紫滴。

zhumengyun 发表于 2014-8-12 18:11:27

谢谢回复,如果知道了为什么,请告诉我。谢谢帮忙。

小靚同学Leon 发表于 2014-8-12 19:06:58

zhumengyun 发表于 2014-8-12 18:11
谢谢回复,如果知道了为什么,请告诉我。谢谢帮忙。

我搞清楚了,updown()这个子函数调用了3次,调用一次子函数,n自加,子函数就会开辟新的栈空间,相应的n被push进栈区,这样一来相应的数字就被保存到不同的栈区。当函数返回时,也要返回3次,从最顶层返回(后进先出的原则),第一层n是4,pop出栈,这时打印出来,最顶层子函数返回,就是第二层子函数了,pop出3,依次类推。其实总结就是主函数调用子函数是通过堆栈的形式完成的。希望你能明白我说的是什么。

zhumengyun 发表于 2014-8-12 19:34:03

谢谢解答。
我明白你说的什么意思,这样可以理解输出4,3,2,1但为什么会输出***呢?而且是4***,3***,2***,1***
也就是n值每次在出栈时都执行printf("%d,%p\n",n,&n);后面的程序段。

小靚同学Leon 发表于 2014-8-12 19:54:35

zhumengyun 发表于 2014-8-12 19:34
谢谢解答。
我明白你说的什么意思,这样可以理解输出4,3,2,1但为什么会输出***呢?而且是4***,3***,2 ...

这。。。
你。。。
你还是好好看书吧。
页: [1]
查看完整版本: 退出递归函数的过程