gpt4 book ai didi

c++ - 对函数返回值感到困惑

转载 作者:塔克拉玛干 更新时间:2023-11-03 06:44:59 29 4
gpt4 key购买 nike

#include<iostream>
using namespace std;
int Fun(int x)
{
int sum=1;
if(x>1)
sum=x*Fun(x-1);
else
return sum;
}
int main()
{
cout<<Fun(1)<<endl;
cout<<Fun(2)<<endl;
cout<<Fun(3)<<endl;
cout<<Fun(4)<<endl;
cout<<Fun(5)<<endl;
}

此函数用于计算整数的阶乘。在x>1的分支中,函数Fun没有返回值。所以这个函数不应该返回正确的答案。

但是当测试fun(4) 或其他一些例子时,却出乎意料地得到了正确的答案。为什么?

该函数的汇编代码为(call Fun(4)):

0x004017E5  push   %ebp
0x004017E6 mov %esp,%ebp
0x004017E8 sub $0x28,%esp
0x004017EB movl $0x1,-0xc(%ebp)
0x004017F2 cmpl $0x1,0x8(%ebp)
0x004017F6 jle 0x40180d <Fun(int)+40>
0x004017F8 mov 0x8(%ebp),%eax
0x004017FB dec %eax
0x004017FC mov %eax,(%esp)
0x004017FF call 0x4017e5 <Fun(int)>
0x00401804 imul 0x8(%ebp),%eax
0x00401808 mov %eax,-0xc(%ebp)
0x0040180B jmp 0x401810 <Fun(int)+43>
0x0040180D mov -0xc(%ebp),%eax
0x00401810 leave
0x00401811 ret

可能是这个原因:sum的值保存在寄存器eax中,返回值也保存在eax中, 所以 Fun 返回正确的结果。

最佳答案

通常,EAX 寄存器用于存储返回值,也用于做其他事情。

因此,在函数返回之前加载到该寄存器的任何内容都将是返回值,即使您不打算这样做也是如此。

您可以使用 -S 选项生成汇编代码,并查看在“ret”指令之前 EAX 发生了什么。

关于c++ - 对函数返回值感到困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23015797/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com