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

时间:2012-05-10 07:01:55

标签: c++ compiler-construction undefined-behavior

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

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

4 个答案:

答案 0 :(得分:3)

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

可以依赖编译器吗?是。

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

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

可以让程序崩溃吗?是。

它可以做我认为它应该做的事情,似乎工作得很好吗?是。

任何事情都可能发生。

答案 1 :(得分:2)

关于未定义的行为,
C ++标准第1.3.24节声明:

  

允许的未定义行为包括完全忽略不可预测的结果,在翻译或程序执行期间以环境特征(有或没有发出诊断消息)的文件化方式行事,终止翻译或执行(发布诊断信息)。

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

答案 2 :(得分:1)

在C ++标准中指定了什么构成了未定义的行为。

当编译器遇到未定义行为的代码时,编译器生成的代码可以是任何内容。这是为编译器编写者提供优化的余地。

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

远离未定义的行为。

答案 3 :(得分:1)

  

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

即可。
可以这样说:

  

明确定义的行为符合标准并得到所有人的支持   编译器同样很好。

因此,

  

未定义的行为不符合标准,编译器也是如此   随心所欲地做任何事情!