未定义的行为是否取决于 c++ 中的编译器

Does Undefined Behavior depend on the compiler in c++?

本文关键字:c++ 编译器 取决于 是否 未定义      更新时间:2023-10-16

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

每个

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

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

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

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

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

它会使程序崩溃吗?是的。

它能做我认为它应该做的事情并且似乎工作正常吗?是的。

任何事情都可能发生。

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

允许的未定义行为包括完全忽略情况并产生不可预测的结果,在翻译或程序执行期间以环境特征的记录方式行为(发出或不发出诊断消息),到终止转换或执行(发出诊断消息)。

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

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

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

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

远离未定义的行为。

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

是的
可以这样争论:

定义良好的行为符合标准,并得到所有人的支持 编译器同样出色。

因此

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