C++ 为什么要在Ideone上编译?

C++ 为什么要在Ideone上编译?,c++,C++,好的,所以我在上面乱搞,无意中提交了这段代码,但令我惊讶的是,它实际编译并输出了一个0的值 #包括 使用名称空间std; 常数int五() { 常数i=5; } int main(){ cout简单明了(来自C++11 6.6.3“返回语句”): 从函数的末尾流出相当于没有值的返回;这会导致值返回函数中出现未定义的行为 因此,编译器几乎可以做任何它想做的事情。显然,诊断是我更喜欢从编译器那里得到的东西,但有时很难诊断(比如当返回在条件逻辑中,并且永远不会到达函数的“结束”时) 请注意,我在GCC

好的,所以我在上面乱搞,无意中提交了这段代码,但令我惊讶的是,它实际编译并输出了一个0的值

#包括
使用名称空间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]