回来11,而我没有回来任何东西

时间:2014-02-23 01:54:57

标签: c++

#include<iostream>

using namespace std;

int increment(int i)
{
    if(i<=10)
    {
        cout<<i;
        i++;
        increment(i);

    }
    //return 0;
}

int main()
{
    cout<<increment(0);
}

当我没有返回任何东西的时候也打印11,你为什么认为它?

2 个答案:

答案 0 :(得分:4)

您的increment函数被声明为返回int,但您没有返回任何内容。您的编译器绝对应该生成警告。

如果您正在使用GCC,则应始终至少指定 -Wall。我更喜欢-Wextra,而-Werror会将这些警告转换为错误,因此编译实际上失败了。请参阅GCC Warning Options


实际发生了什么?许多体系结构的ABI / calling convention指定一个特定的CPU寄存器来保存函数的返回值。 (在x86上,这是eax,在ARM上,这是r0。)由于函数中没有return语句,编译器不会在该寄存器中放入任何值函数返回前的返回值。在该寄存器中恰好是的值是调用函数将作为返回值看到的。

答案 1 :(得分:1)

在大多数处理器的调用约定中,有一个寄存器用于返回适合本机寄存器字的值。调用约定还指定哪些寄存器是“调用者保存”(可以在不被函数保存的情况下进行更改)和“被调用者保存”(必须未使用或由函数保存和恢复)。返回寄存器自然是“调用者保存”类型的寄存器,因为它将被函数修改以返回值。这意味着在函数体内,可能会选择作为临时寄存器。在您的情况下,寄存器用于i,并且由于没有显式返回来修改该寄存器,当函数返回给调用者时,它仍然设置为11。