调用递归函数,并返回值。

mediam2000 2008-11-09 01:06:03
#include<stdio.h>

int age(int n);

main()
{
printf("%d\n", age(3));
getch();
}

int age(int x)
{
if(x == 0)
return 100;
else
age(x - 1) + 2;/* age前面没有加return ,但执行程序的结果是100?*/
}
...全文
231 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xxgamexx 2008-11-09
  • 打赏
  • 举报
回复
sorry~

是因为 return 100 存储到了一个临时变量

printf("%d\n", age(3)); age(3)会指向这个临时变量 寄存器的变量值是100 没有改变 所以输出的是100
xxgamexx 2008-11-09
  • 打赏
  • 举报
回复
因为

函数运行的状况是

x
x-1
x-2
x-3
..
0

然后 你return 100了

所以无论你多少 都return 100 那个参数在这里仅仅只有递归次数的含义了
glacier3d 2008-11-09
  • 打赏
  • 举报
回复
原因:这和编译原理有关,当递归到底时,总会调用return 100这一句,调用后,寄存器eax被赋值为0x64,而在各级递归返回时,都没有修改eax的值,所以最外层的age()调用返回后,eax里的值仍是0x64,从而printf("%d\n", age(3))从eax读取返回值时,读到的仍是0x64,即100。
具体可从反汇编后看出来,如下:


if(x == 0)
00411B7E 83 7D 08 00 cmp dword ptr [x],0
00411B82 75 07 jne age+2Bh (411B8Bh)
return 100;
00411B84 B8 64 00 00 00 mov eax,64h
00411B89 EB 0F jmp age+3Ah (411B9Ah)
else
age(x - 1) + 2;/* age前面没有加return ,但执行程序的结果是100?*/
00411B8B 8B 45 08 mov eax,dword ptr [x]
00411B8E 83 E8 01 sub eax,1
00411B91 50 push eax
00411B92 E8 D2 F4 FF FF call age (411069h)
00411B97 83 C4 04 add esp,4
mediam2000 2008-11-09
  • 打赏
  • 举报
回复
int age(int x)
{
if(x == 0)
return 100;
else
age(x - 1) + 2; /*这里的return是故意不加的,为什么此函数还会向调用函数返回100的值?
按照逻辑:if x != 0;此函数不会向调用函数返回任何值*/
}
xxgamexx 2008-11-09
  • 打赏
  • 举报
回复
或者

#include <stdio.h>
int age(int n);
main()
{
printf("%d\n", age(3));
getch();
}
int age(int x)
{
return x==0?100:age(x-1)+2;
}
xxgamexx 2008-11-09
  • 打赏
  • 举报
回复
改成:


#include <stdio.h>

int age(int n);

main()
{
printf("%d\n", age(3));
getch();
}

int age(int x)
{
if(x == 0)
return 100;
else
return age(x - 1) + 2;
}


69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧