加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

c – 为什么在Ideone上编译?

发布时间:2020-12-16 03:08:59 所属栏目:百科 来源:网络整理
导读:好的,所以我在 Ideone上搞砸了,不小心提交了这段代码,但令我吃惊的是,它实际编译并运行了一个0,0 here的值. #include iostreamusing namespace std;const int five( ){ const int i = 5;}int main() { cout five( ) endl; return 0;} 然后,我在Visual Studio
好的,所以我在 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及更高版本特别处理.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读