在下面的代码部分中,函数中没有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;
}
Run Code Online (Sandbox Code Playgroud)
不,从函数中获得正确答案不是正常行为,这是巧合.你应该不靠这个.
从C++ 03开始,6.6.3 The return statement /2(以及C++ 11的相同部分):
流出函数末尾相当于没有值的返回; 这会导致值返回函数中的未定义行为.
您可能会发现只是因为您的调用约定的副作用而得到了正确的答案.
例如,如果在(mtyhical)r0寄存器中返回函数值,则可能是计算使用函数内的该寄存器来保存该值,然后将其存储到表示product变量的存储器中.所以r0当你回来的时候它就是事情发生的一个悬念.
使用不同级别的优化进行编译,或者使用其他编译器进行编译,或者甚至在蓝色月亮的星期二晚上进行编译可能会影响结果,这是未定义行为的主要问题 - 这是不值得信任的.至少,一个好的编译器会警告你这件事.