没有返回语句,函数执行成功
without return statement function executed successfully
我发现这段代码在一些站点,它没有返回值的任何返回语句。但在网站上,它被写为给出编译时错误。当我试图编译程序时,知道编译器中会看到什么错误。程序编译成功,没有任何错误。
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、编译器选项、周围代码),所以你不能依赖它。
相关文章:
- 如何以及何时使用 getline 函数执行计算?
- 主函数执行时C++堆栈溢出异常
- 如何编写在函数执行过程中垃圾回收的测试用例?
- 插入到映射中的元素在函数执行后清除
- 遵循 C++ 中的构造函数执行顺序
- 成员函数执行时成员变量的增量
- 关于如何在函数执行后使用和获取返回值的问题
- 从 C 代码 system() 函数执行的 Linux 命令与从终端执行时给出的结果不同
- 顺序异构函数执行器
- 静态 LPTSTR 变量在函数执行后丢失值
- C++如何使函数执行得更快
- C 中函数执行的优先顺序
- 函数执行时间
- 当类成员函数执行时,程序停止工作
- 主函数执行之前的C++segfault
- 如何使用以查看<chrono>函数执行所花费的时间
- 如何从另一个函数执行一个函数
- 函数执行一次
- 为我自己的函数执行通常的算术转换
- 如何对继承构造函数执行正确的SFINAE