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

Returning 11 while I am not returning anything

本文关键字:返回 任何东      更新时间:2023-10-16
#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,你为什么认为它是?

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

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


到底发生了什么?许多体系结构的 ABI/调用约定指定特定的 CPU 寄存器来保存函数的返回值。(在x86上这是eax,在ARM上这是r0。 由于函数中没有return语句,因此编译器不会在该寄存器中放入任何值作为函数返回值。无论该寄存器中碰巧存在什么值,调用函数都将看到返回值。

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