其他分享
首页 > 其他分享> > c – 对函数返回值感到困惑

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