c++ - 没有返回语句但编译并返回正确答案的函数

标签 c++

在下面的代码部分,函数中没有 return 语句,但它仍然编译并给出了正确的答案。这是正常行为吗?

#include <iostream>

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

int main (int argc, char **argv) {
    std::cout << multiply(4, 5) << std::endl;
    return 0;
 }

最佳答案

不,从函数中得到正确答案不是正常行为,这是巧合。你不应该依赖这个。

从 C++03 开始​​,6.6.3 返回语句/2(以及 C++11 的相同部分):

Flowing off the end of a function is equivalent to a return with no value; this results in undefined behavior in a value-returning function.

可能会发现您得到正确答案仅仅是因为调用约定的副作用。

例如,如果函数值在 (mtyhical) r0 寄存器中返回,则可能是 计算 在函数中使用该寄存器来保存该值,然后将其存储到代表 product 变量的内存中。所以当你返回时它在 r0 中的事实只是事情完成方式的宿醉。

使用不同级别的优化进行编译,或使用其他编译器,甚至在蓝月期间的周二晚上进行编译都可能会影响结果,这是未定义行为的主要问题 - 它是不可信的。至少,一个好的编译器会就此警告您。

关于c++ - 没有返回语句但编译并返回正确答案的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25049280/

相关文章:

C++ STL pop_heap 不工作

c++ - R 值和 L 值的输出不同。为什么?

c++ - 在 objective-c ++上运行时,字符串函数C++返回空

c++ - 没有明显好处的功能声明

c++ - 函数体调用 C++ 末尾的奇怪循环

c++ - 爬取 Windows 程序菜单信息 C++

c++ - WriteFile() 可以用来将 wchar_t 字符写入文件吗?

c++ - 日期更改为第二天时 booSTLog 异常

c++ - 转换运算符重载以返回 2-dim 数组以访问外部库

c++ - Win32 项目生成 MFC 错误