没有返回语句,函数执行成功

without return statement function executed successfully

本文关键字:函数 执行 成功 语句 返回      更新时间:2023-10-16

我发现这段代码在一些站点,它没有返回值的任何返回语句。但在网站上,它被写为给出编译时错误。当我试图编译程序时,知道编译器中会看到什么错误。程序编译成功,没有任何错误。

c++代码为:

int multiply(int x, int y)
{
  int product = x * y;
}
int main()
{
  cout << multiply(4, 5) << endl;
  return 0;
}

输出:20

现在我很困惑,没有任何返回语句,编译是如何成功的。

函数中没有return语句,此代码调用未定义行为。非void函数必须有返回语句。

c++ 11§6.6.3返回语句

3…从函数的末尾流出相当于没有返回值;这将导致未定义的行为中的值返回函数。

正如WhozCraig在评论中所说,有一个标准定义的非空返回值异常需要return: int main()

c++ 11§3.6.1p5 [basic.start.main]

如果控制到达main语句的末尾而没有遇到return语句,效果是执行return 0;

在UB的情况下,您可能会得到预期或意外的结果。
打印的值可以是存储在堆栈中的值

如果一个返回非void的函数没有返回任何东西,这是未定义的行为。编译器应该至少给你一个警告。

可能发生的情况是,在函数退出后,product的值仍然在堆栈中,std::cout打印该值。但是,不要依赖未定义的行为

这是未定义的行为,所以不能保证它会工作。

当它正确工作时,这是因为结果恰好是在用于从函数返回整数值的相同CPU寄存器中计算的。这取决于许多因素(例如编译器版本、系统ABI、编译器选项、周围代码),所以你不能依赖它。