递归函数返回值的问题
前几天写了个哈西表的程序,里面用到的递归。由于是看着书上的算法写的,虽然程序的功能实现了,可关于递归还是有些不懂。然后我回家敲些关于递归函数的程序,发现其中存在好奇妙的关系,下面是我的代码和编译后的截图,希望大神能帮我解答。程序代码:
#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 }
当运行上面的程序时,结果是
这个我不大理解的是,在当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); ”这样使程序的结果又回到了以前我所预料到的情况。下面是截图:
这上面的问题我实在是搞不大懂,希望大神指点一下。
谢谢!!