在下面的代码部分,函数中没有 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/