好的,所以我在
Ideone上搞砸了,不小心提交了这段代码,但令我吃惊的是,它实际编译并运行了一个0,0
here的值.
#include <iostream> using namespace std; const int five( ) { const int i = 5; } int main() { cout << five( ) << endl; return 0; }
然后,我在Visual Studio中尝试这样做,而在Codepad,但是由于five()不返回值,所以无法编译,因为可以预期.我的问题是,当然,为什么这个编译在Ideone,即使代码,我的理解是错误的,不应该编译.
解决方法
简单(来自C 11 6.6.3“退货单”):
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.
所以编译器几乎被允许做任何它想要的.显然,诊断是我从编译器中选择的,但是有时候可能很难诊断(比如当返回到条件逻辑内部时,函数的“结束”将永远不会达到).
请注意,我使用GCC 4.6.1(使用墙选项)得到以下警告:
test.cpp:8:1: warning: no return statement in function returning non-void [-Wreturn-type]
我不知道什么选择ideone传递给GCC(我想象 – 将会做同样的4.3.4版本,ideone使用).
一些相关信息:
在C中,在某些情况下声明为返回值实际不这样做的函数是可行的;在C中,如果实际使用函数的返回值,它只会导致未定义的行为.预标准C并不总是支持void类型,所以没有返回任何东西的函数通常被声明为显式或隐式地返回int.来自C99 6.9.1 / 12“函数定义”:如果达到终止函数的函数,并且调用者使用函数调用的值,则行为是未定义的.
另外,正如几个评论中所提到的,流出main()的结尾被C和C99及更高版本特别处理.