C++ 在没有返回语句的情况下,函数成功执行

C++ 在没有返回语句的情况下,函数成功执行,c++,C++,我在一些网站上发现这段代码,它没有任何返回值的返回语句。 但是在站点中,它是编写的,因为它会产生编译时错误。 当我试图编译程序时,为了知道编译器中会出现什么错误。 程序编译成功,没有给出任何错误 < C++代码是: int multiply(int x, int y) { int product = x * y; } int main() { cout << multiply(4, 5) << endl; return 0; } int乘法(int x,i

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

< C++代码是:

int multiply(int x, int y)
{
  int product = x * y;
}

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

此代码调用的函数中不包含
return
语句。非
void
函数必须具有return语句

C++11§6.6.3返回声明: 3…从函数末尾流出相当于没有值的返回;这会导致值返回函数中出现未定义的行为

如注释中所述,对于非无效返回值,有一个标准定义的例外情况需要
返回
int main()

C++11§3.6.1p5[basic.start.main] 如果控件到达main的末尾时没有遇到return语句,则其效果是执行
return0;

对于UB,您可能会得到预期或意外的结果。

打印的值可以是存储在堆栈中的值。

没有此代码调用的函数中的
return
语句。非
void
函数必须有return语句

C++11§6.6.3返回声明: 3…从函数末尾流出相当于没有值的返回;这会导致值返回函数中出现未定义的行为

如注释中所述,对于非无效返回值,有一个标准定义的例外情况需要
返回
int main()

C++11§3.6.1p5[basic.start.main] 如果控件到达main的末尾时没有遇到return语句,则其效果是执行
return0;

对于UB,您可能会得到预期或意外的结果。

打印的值可以是存储在堆栈中的值。

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


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

如果返回非void的函数没有返回任何内容,则为未定义的行为。编译器至少应该给您一个警告


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

这是未定义的行为,因此不能保证它会工作


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

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



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

编译两个版本,一个有返回语句,另一个没有返回语句。在调试器中运行这两个版本,并在每次
ret
之前查看反汇编。发生的事情将是显而易见的。也就是说,不要依赖它。启用所有警告…无论说什么都是编译器错误。也许你误解了ted它,它只是在谈论一个特定的编译器(例如,MSVC)。嗨,克里斯,我正在使用GnuGcc编译器,代码已经在代码块IDE中编译了。:@chris:MSVC发出一个
错误C4716:“乘法”:必须返回一个值
诊断,即使我将警告级别一直调低(/W0)。编译两个版本,一个有返回语句,另一个没有返回语句。在调试器中运行这两个版本,并在每个
ret
之前查看反汇编。发生的事情将是显而易见的。也就是说,不要依赖它。启用所有警告…无论说什么都是编译器错误。也许你误解了它,它只是在说话关于一个特定的编译器(例如,MSVC)。嗨,克里斯,我正在使用GnuGcc编译器,代码已经在代码块IDE中编译。:)@chris:MSVC发出
错误C4716:“乘法”:即使我将警告级别一直调低(/W0),也必须返回值
诊断.Hi,haccks我确实认为非void函数必须有一个return语句。但是在上面的代码中,函数在没有任何return语句的情况下成功执行,对此我感到困惑…:)@user1903535,请再次阅读:未定义的行为。注意:非void返回值有一个标准定义的异常,需要返回
return
int main()据我所知,它是唯一存在此异常的。所有其他非void非返回stmt函数的格式都不正确。此外,拥有一个return语句是不够的。所有路径都必须有一个可访问的return语句。@WhozCraig;是的。添加它。只有在实际到达函数末尾时才是未定义的行为。可以如果函数从未被调用,或者它有一个无限循环,或者在前面有一个总是到达的不同的返回语句,那么在结尾没有一个返回语句。haccks我相信非void函数必须有一个返回语句。但是在上面的代码中,函数在没有任何返回语句的情况下成功执行