返回 11,而我没有返回任何东西
Returning 11 while I am not returning anything
#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。
相关文章:
- 模板化接口 - 创建一个泛型模板类以返回任何容器
- 这是使用回溯的 nqueen 问题,但我使用了动态 2d 数组,我的程序编译良好,但不返回任何输出
- C++ - 声明指向返回任何类型并获取任意数量参数的函数的指针
- 类和构造函数中的函数根本不起作用,并且不返回任何错误
- 为什么套接字中的 recv() 函数不返回任何内容?
- C++如何使虚拟函数返回任何类型的指针
- 返回类型为struct的函数每次调用时都不返回任何内容
- 此程序不返回任何内容
- std::ifstream.read() 不会向我的缓冲区返回任何内容
- 为什么即使输入相等,v3 也不会返回任何内容
- glGetBufferSubData() 不返回任何数据?
- stbi_load() 不返回任何内容,但不返回 null
- 如何处理不保证返回任何内容的函数
- C++递归不返回任何内容
- MySQL++ 不返回任何内容
- stbi_load不返回任何值
- 为什么GetEffectiveRightsFromAcl在这种情况下不返回任何权利?
- 当将编译器从G 切换到MSVC时,为什么此开关语句不会返回任何内容
- 分配运营商为什么返回任何开始
- 使用 Module32First 获取模块的 modBaseAddr 不返回任何内容