C++ 为什么要在Ideone上编译?
好的,所以我在上面乱搞,无意中提交了这段代码,但令我惊讶的是,它实际编译并输出了一个0的值C++ 为什么要在Ideone上编译?,c++,C++,好的,所以我在上面乱搞,无意中提交了这段代码,但令我惊讶的是,它实际编译并输出了一个0的值 #包括 使用名称空间std; 常数int五() { 常数i=5; } int main(){ cout简单明了(来自C++11 6.6.3“返回语句”): 从函数的末尾流出相当于没有值的返回;这会导致值返回函数中出现未定义的行为 因此,编译器几乎可以做任何它想做的事情。显然,诊断是我更喜欢从编译器那里得到的东西,但有时很难诊断(比如当返回在条件逻辑中,并且永远不会到达函数的“结束”时) 请注意,我在GCC
#包括
使用名称空间std;
常数int五()
{
常数i=5;
}
int main(){
cout简单明了(来自C++11 6.6.3“返回语句”):
从函数的末尾流出相当于没有值的返回;这会导致值返回函数中出现未定义的行为
因此,编译器几乎可以做任何它想做的事情。显然,诊断是我更喜欢从编译器那里得到的东西,但有时很难诊断(比如当返回在条件逻辑中,并且永远不会到达函数的“结束”时)
请注意,我在GCC 4.6.1中得到了以下警告(使用Wall
选项):
我不确定ideone传递给GCC的选项是什么(我想,-Wall
会对ideone使用的4.3.4版本执行相同的操作)
一些相关信息:
在C语言中,声明返回值的函数在某些情况下不实际返回值是可以的;在C语言中,如果函数的返回值被实际使用,它只会导致未定义的行为。前标准C语言并不总是支持void
类型,所以没有返回任何内容的函数通常被声明为返回int
,显式或隐式。从C99 6.9.1/12“函数定义”:如果达到终止函数的}
,并且调用方使用函数调用的值,则行为未定义
同样,如一对夫妇的注释中提到的,从主()/<代码>的结尾被C++和C99和以后特别处理。
< P>不从非虚函数返回值是错误的,但不是所有编译器都将其视为一个错误——例如,GCC在遇到此情况时只发出警告。其他编译器可能是偏执狂(他们是对的),不允许您编译这样的代码。当然,可以使用不同的开关和选项修改编译器行为
0的返回值只是一个随机值——它可能同样是255,-1或任何其他垃圾,因为这样做是未定义的行为(main除外,对于main,C99指定应采用隐式0返回值)。ideone似乎不显示警告,它仅在出现错误时显示编译器输出。在ideone正在使用的GCC版本(GCC4.3)上,这不是一个错误,只是一个警告 代码具有未定义的行为。即使您所做的是错误的,编译器也不需要对其进行诊断。另一点是,ideone使用的是现在相当旧的gcc版本。一个合理的当前版本的gcc(例如4.7)至少会给你一个警告,你的函数被声明为返回一个值,但不是——但不是默认的。你必须用“代码> >墙>代码来打开它,但是一般情况下,我至少会使用GCC墙。”/P>你能引用引用的来源吗?它唯一定义的时间是<代码>主< /代码> @塞斯卡内基,它在C++中还是在C中定义良好?使用gcc编译,int main(){}
给出一些随机退出代码。@NiklasR从C99开始,到达以main
结尾的}
表示返回0代码>。(如果main
的返回类型与int
兼容,则未指定其他类型。)@Loggie“undefined”相当“非法”;这意味着任何事情都可能发生,从返回随机值到用信用卡订购比萨饼。
#include <iostream>
using namespace std;
const int five( )
{
const int i = 5;
}
int main() {
cout << five( ) << endl;
return 0;
}
test.cpp:8:1: warning: no return statement in function returning non-void [-Wreturn-type]