69,373
社区成员
发帖
与我相关
我的任务
分享
#include<stdio.h>
int main()
{
int digui(int i);
int i;
scanf("%d",&i);
i=digui(i);
printf("i=%d\n",i);
}
int digui(int i)
{
int d=0;
d=i+1;
printf("d=%d\n",d);
if(d==10)
{
return(d);
}
else
{
i=digui(d);
}
// printf("i=%d i is address=%d\n",i,&i); #1
// return(i); #2
}
眼过千遍不如手过一遍!
书看千行不如手敲一行!
手敲千行不如单步一行!
单步源代码千行不如单步对应汇编一行!
int digui(int i)
{
if(...)
{
return ...;
}
else
{
return digui(...);
}
}
另外对递归过程的理解是纯粹的逻辑问题,就看能不能想明白,为此研究汇编实现没什么必要i=digui(d);
00D63A96 mov eax,dword ptr [d]
00D63A99 push eax
00D63A9A call digui (0D61429h)
00D63A9F add esp,4
00D63AA2 mov dword ptr [i],eax //就是把eax的值写入i中
从这里可以看出,return语句其实就是把需要return的值压入eax中,然后到调用的地方读取这个值。
因为printf本身也是一个函数调用嘛,所以你可以猜测下,调用了printf后eax的值改变了,应该是printf返回了一个值。写一句c=printf("i=%d\n i is address=%d\n",i,&i);
然后printf("%d\n",c);看看就知道了。结果可以看出,c的值就是你返回给i值。
我查了下,printf()的返回值就是打印的字符串长度,你可以去验证下。
void swap(int a,int b){
int t=a;
a=b;
b=t;
}
int main(){
……
swap(a,b);
……
}
你觉得主函数调用了swap(a,b)之后回到那里了?当然是main调用swap的地方咯
当然,如果你说的是你的函数是一个有返回值的函数,但是里面却没有返回语句的话,或者说只有一条在if语句中的return语句的话。那么这个函数仍然可以执行,但是如果在java或者C#就会有一个error就是没有所有路径都有返回值。也就是说C++允许这种写法,但是会返回什么值要看编译器的实现了,具体看一下汇编嘛,应该是某个寄存器的残留值。这个的确是不合理的,你的想法是对的。