gpt4 book ai didi

c++ - 为什么要在 Ideone 上编译?

转载 作者:可可西里 更新时间:2023-11-01 16:27:27 25 4
gpt4 key购买 nike

好吧,我在 Ideone 上搞砸了并意外提交了这段代码,但令我惊讶的是它实际上编译并运行输出值 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 中收到以下警告(使用 Wall 选项):

test.cpp:8:1: warning: no return statement in function returning non-void [-Wreturn-type]

我不确定 ideone 向 GCC 传递了哪些选项(我想 -Wall 会对 ideone 使用的 4.3.4 版本做同样的事情)。

一些相关信息:

在 C 语言中,声明返回值的函数在某些情况下实际上不返回值是可以的;在 C 语言中,如果函数的返回值确实被使用,它只会导致未定义的行为。准标准 C 并不总是支持 void 类型,因此不返回任何内容的函数通常被显式或隐式声明为返回 int。来自 C99 6.9.1/12“函数定义”:如果到达终止函数的 },并且函数调用的值被调用者使用,则行为未定义。

此外,正如一些评论中提到的,main() 末尾的流被 C++ 和 C99 及更高版本特殊处理。

关于c++ - 为什么要在 Ideone 上编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11495292/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com