#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,你为什么认为它?
答案 0 :(得分:4)
您的increment
函数被声明为返回int
,但您没有返回任何内容。您的编译器绝对应该生成警告。
如果您正在使用GCC,则应始终至少指定 -Wall
。我更喜欢-Wextra
,而-Werror
会将这些警告转换为错误,因此编译实际上失败了。请参阅GCC Warning Options。
实际发生了什么?许多体系结构的ABI / calling convention指定一个特定的CPU寄存器来保存函数的返回值。 (在x86上,这是eax
,在ARM上,这是r0
。)由于函数中没有return
语句,编译器不会在该寄存器中放入任何值函数返回前的返回值。在该寄存器中恰好是的值是调用函数将作为返回值看到的。
答案 1 :(得分:1)
在大多数处理器的调用约定中,有一个寄存器用于返回适合本机寄存器字的值。调用约定还指定哪些寄存器是“调用者保存”(可以在不被函数保存的情况下进行更改)和“被调用者保存”(必须未使用或由函数保存和恢复)。返回寄存器自然是“调用者保存”类型的寄存器,因为它将被函数修改以返回值。这意味着在函数体内,可能会选择作为临时寄存器。在您的情况下,寄存器用于i
,并且由于没有显式返回来修改该寄存器,当函数返回给调用者时,它仍然设置为11。