c语言递归1到10联程,为什么这个递归能输出1到10

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼

首先你的main函数调用printN,作为调用者他会做这么几件事

1.将参数10压栈;

2.将Return Address压栈,即第19行的地址;

3.跳转到函数体;

在函数体中,作为被调用者他会做这么几件事:

......初始化操作......

if N != 0

将N-1压栈,

将Return Address压栈,即第6行的地址,

然后跳转到函数体;

打印N的值;

else

......恢复操作.....

函数返回;

当N=0时,栈帧类似下面的情况:

------------------------

saved ebp(下方栈帧的ebp地址)

------------------------

return address

------------------------

N=0

------------------------

saved ebp (下方栈帧的ebp地址)

------------------------

return address (EBP+4)

------------------------

N=1 (EBP+8)

------------------------

.....

------------------------

saved ebp

------------------------

return address

------------------------

N=9

------------------------

saved ebp (main函数栈帧的ebp地址)

------------------------

return address

------------------------

N=10

------------------------

....

------------------------

当N=0时,并且if执行完成后,会:

1.恢复esp(销毁局部变量),弹出ebp(ebp为下面栈帧的地址);

2.跳转到返回地址

然后执行返回地址+1处的代码,打印出N=1(因为ebp已经恢复,参数就是EBP+8这个位置的元素 );

...依次类推...

最后返回main函数的栈帧继续执行;

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值