c – 对函数返回值感到困惑
作者:互联网
#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中,所以Funreturn正确的结果.
解决方法:
通常,EAX寄存器用于存储返回值,ad也用于存储其他内容.
因此,即使您不打算这样做,在函数返回之前加载到该寄存器的任何内容都将是返回值.
您可以使用-S选项生成汇编代码,并在“ret”指令之前查看EAX发生了什么.
标签:c,return-value 来源: https://codeday.me/bug/20191008/1873700.html