c语⾔递归函数为什么要返回,递归函数返回值的有关问题递归函数返回值的问题
前⼏天写了个哈西表的程序,⾥⾯⽤到的递归。由于是看着书上的算法写的,虽然程序的功能实现了,可关于递归还是有些不懂。然后我回家敲些关于递归函数的程序,发现其中存在好奇妙的关系,下⾯是我的代码和编译后的截图,希望和⼤神交流⼀下经验。
#include
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
}
当运⾏上⾯的程序时,结果是
这个我不⼤理解的是,在当d=10时,它返回d给上⼀层的i,可是当执⾏了“i=digui(d)”后,然后怎么搞呢?是编译器⾃⼰默认⾃⼰return吗?它把谁的值return呢?(根据编译结果知道是把i的值return是吧,可是问题在后⾯呢?)
在当我在递归函数后⾯加上“printf("i=%d    i is address=%d\n",i,&i); ”这句代码时编译结果完全不同了,
下⾯是截图:
当d=10时,它返回d给上⼀层的i,于是执⾏了“printf("i=%d    i is address=%d\n",i,&i); ”这句代码,结果是i=10,然后就⼜是上⼀层的i了,⼜执⾏“printf("i=%d    i is address=%d\n",i,&i); ”这句代码,可是结果是i=29。就这样直到栈的清空。为什么会出现这样的结果?多加了⼀句貌似与程序⽆关的代码,却使程序的结果发⽣了重⼤变化。
最后当我在程序的⼜加了句“return(i);  ”这样使程序的结果⼜回到了以前我所预料到的情况。下⾯是截图:
这上⾯的问题我实在是搞不⼤懂,希望⼤神指点⼀下。
谢谢!!
递归
return
变量
分享到:
------解决⽅案--------------------
有那么复杂吗?把你不懂的说的尽可能简单⼀点
------解决⽅案--------------------
我问你个问题,⽐如这个函数void swap(int a,int b){
int t=a;
a=b;
b=t;
}
int main(){递归函数c语言规则
swap(a,b);
……
}
你觉得主函数调⽤了swap(a,b)之后回到那⾥了?当然是main调⽤swap的地⽅咯
当然,如果你说的是你的函数是⼀个有返回值的函数,但是⾥⾯却没有返回语句的话,或者说只有⼀条在if语句中的return语句的话。那么这个函数仍然可以执⾏,但是如果在java或者C#就会有⼀个error就是没有所有路径都有返回值。也就是说C++允许这种写法,但是会返回什么值要看编译器的实现了,具体看⼀下汇编嘛,应该是某个寄存器的残留值。这个的确是不合理的,你的想法是对的。
------解决⽅案--------------------
发现前⾯⼀半和你的问题有点⽆关,算了...
------解决⽅案--------------------
给你看段,也就是函数返回值的问题: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()的返回值就是打印的字符串长度,你可以去验证下。
------解决⽅案--------------------
引⽤:谢谢指教!!
正是因为对c语⾔其中的不理解,现在正在⾃学《汇编语⾔》。
在我发这个帖⼦的时候我已经知道上⾯那个程序是存在问题的,因为函数在后⾯没有return,我只是没有明确上⾯那个递归函数是不是是⾃⼰默认返回⼀个值,返回是那个是随机取⼀个变量,还是与程序中的某些信息有关?
嗯,学⼀下汇编还是有好处的,很多问题都可以根据⽣成的汇编码来理解。不过有⼀个问题要注意下,汇编码本⾝是否是跟实现本⾝有关的?就是说换⼀个环境,汇编码就不同了?学语⾔不应该去遵循实现来学习,应该按照提供的标准来学习。⾄于⾥⾯的⼀些难点疑惑,可以结合汇编的形式来解决。
------解决⽅案--------------------
引⽤:Quote: 引⽤:Quote: 引⽤:谢谢指教!!
正是因为对c语⾔其中的不理解,现在正在⾃学《汇编语⾔》。
在我发这个帖⼦的时候我已经知道上⾯那个程序是存在问题的,因为函数在后⾯没有return,我只是没有明确上⾯那个递归函数是不是是⾃⼰默认返回⼀个值,返回是那个是随机取⼀个变量,还是与程序中的某些信息有关?
嗯,学⼀下汇编还是有好处的,很多问题都可以根据⽣成的汇编码来理解。不过有⼀个问题要注意下,汇编码本⾝是否是跟实现本⾝有关的?就是说换⼀个环境,汇编码就不同了?学语⾔不应该去遵循实现来学习,应该按照提供的标准来学习。⾄于⾥⾯的⼀些难点疑惑,可以结合汇编的形式来解决。
我也是刚开始学汇编的,对于汇编的环境什么的不⼤懂。您上⾯说的“就是说换⼀个环境,汇编码就不同了”指的是pc机16位、32位、和64位的环境吗?

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。