0

未定义的行为是否依赖于 c++ 中的编译器?

每个编译器对每个问题都有自己的行为!

4

4 回答 4

3

未定义确实意味着未定义。也就是说,任何事情都可能发生。

它可以依赖于编译器吗?是的。

所有编译器都可以做同样的事情吗?是的。

它可以今天做一件事,明天做一件事吗?是的。

它可以使程序崩溃吗?是的。

它可以做我认为它应该做的事情并且看起来工作正常吗?是的。

任何事情都有可能发生。

于 2012-05-10T07:15:02.520 回答
2

关于未定义行为,
C++ 标准第 1.3.24 节指出:

允许的未定义行为的范围从完全忽略具有不可预测结果的情况,到在翻译或程序执行期间以环境特征的记录方式表现(有或没有发出诊断消息),到终止翻译或执行(发出的诊断消息)。

所以,是的,当发生未定义的行为时,编译器可以自由地显示他们想要的任何行为。

于 2012-05-10T07:09:26.067 回答
1

C++ 标准中规定了构成未定义行为的内容。

根据定义,编译器在遇到表现出未定义行为的代码时生成的代码可以是任何代码。这是为了给编译器编写者优化的余地。

请注意,未定义的行为意味着您的程序可以做任何事情。它不保证它会崩溃,或抛出异常,或写入某个内存区域。如您所知,它可以删除您的整个文件系统,然后取出垃圾——这在 C++ 标准中是可以的。

远离未定义的行为。

于 2012-05-10T07:06:22.057 回答
1

未定义的行为是否依赖于 c++ 中的编译器?

的。
可以这样论证:

定义良好的行为符合标准,并且受到所有编译器的同等支持。

因此,

未定义的行为不符合标准,编译器可以自由地做任何他们想做的事情!

于 2012-05-10T07:06:29.113 回答