为何C++函数未显式定义return语句仍会返回值?
为什么无return语句的C++函数能返回值?
你遇到的是C++里的未定义行为,标准里明确规定:非void类型的函数如果没有通过return语句显式返回值,程序的行为完全不可预测,没有任何保证。
为什么看起来返回了正确的c值?
这纯粹是巧合。在多数编译器的默认栈帧和寄存器使用规则里,函数的返回值会存在特定寄存器(比如x86架构的EAX寄存器)。你的代码里int c = a + 1;执行时,计算结果刚好被存在了这个寄存器里,主函数调用sum(25)时,就误把这个寄存器里的值当成了返回值。但这种情况完全不可靠:
- 换个编译器(比如从GCC换成MSVC)结果可能变
- 调整编译优化等级(比如开
-O2)结果可能变 - 哪怕只是在函数里加一行无关代码,结果也可能完全不同
为什么编译器没报错?
很多编译器默认不会严格检查这种问题,但如果开启警告(比如GCC加-Wall参数),就会提示你:control reaches end of non-void function(执行流走到了非void函数的末尾却没返回值)。建议写代码时始终开启编译警告,提前规避这类问题。
正确的写法
必须给非void函数加上显式的return语句:
#include <iostream> using namespace std; int sum(int a) { int c = a + 1; return c; // 显式返回计算结果 } int main() { cout << sum(25); return 0; }
内容的提问来源于stack exchange,提问作者coding wale
相关产品推荐
相关产品推荐

