鱼C论坛

 找回密码
 立即注册
查看: 1475|回复: 5

退出递归函数的过程

[复制链接]
发表于 2014-8-12 14:31:45 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
#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");       /*为什么在推出递归的过程中也会执行这一句*/
}
结果是
1  0018FEF4
2  0018FE9C
3  0018FE44
4  0018FEEC
4  0018FEEC
***
3  0018FE44
***
2  0018FE9C
***
1  0018FEF4
***
为什么在推出递归时,会执行printf("***\n");  语句呢,(事实上printf("%d,%p\n",n,&n);后的语句都会执行

想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2014-8-12 17:39:00 | 显示全部楼层
我调试了下代码,printf("***\n")这句执行完后,程序并不回main函数,而是跳至updown(n+1),n自减,酱紫再循环3次输出后,跳回main函数。必须将n减为1才能跑回main函数。至于为什么我还没搞清楚,但是实际调试就是酱紫滴。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-12 18:11:27 | 显示全部楼层
谢谢回复,如果知道了为什么,请告诉我。谢谢帮忙。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2014-8-12 19:06:58 | 显示全部楼层
zhumengyun 发表于 2014-8-12 18:11
谢谢回复,如果知道了为什么,请告诉我。谢谢帮忙。

我搞清楚了,updown()这个子函数调用了3次,调用一次子函数,n自加,子函数就会开辟新的栈空间,相应的n被push进栈区,这样一来相应的数字就被保存到不同的栈区。当函数返回时,也要返回3次,从最顶层返回(后进先出的原则),第一层n是4,pop出栈,这时打印出来,最顶层子函数返回,就是第二层子函数了,pop出3,依次类推。其实总结就是主函数调用子函数是通过堆栈的形式完成的。希望你能明白我说的是什么。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2014-8-12 19:34:03 | 显示全部楼层
谢谢解答。
我明白你说的什么意思,这样可以理解输出4,3,2,1但为什么会输出***呢?而且是4***,3***,2***,1***
也就是n值每次在出栈时都执行printf("%d,%p\n",n,&n);后面的程序段。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

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

这。。。
你。。。
你还是好好看书吧。
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-18 10:51

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表