c++ - 为什么语句是: "undefined behavior means the compiler can do anything it wants" true?

标签 c++ compiler-construction undefined-behavior

具体引用:https://blogs.msdn.microsoft.com/oldnewthing/20140627-00/?p=633/

我是一名新的 C++ 程序员,目前正在学习未定义的行为及其对程序的影响。我被专门链接到上面的博客,它说当未定义的行为发生时,任何事情都可能发生。

它多次特别提到编译器可以允许发生未定义行为时发生任何事情。

具体是什么导致了这种情况的发生,为什么会发生?

最佳答案

没有什么“导致”这种情况发生。未定义的行为不能“发生”。没有神秘的力量降临到你的电脑上,突然让它在猫体内产生黑洞。

当你运行一个行为未定义的程序时,任何事情都可能发生,is stated as fact by the C++ standard.这是一种余地声明,是编译器用来对您的代码做出假设以提供有用的优化的方便借口。

例如,如果我们说取消引用 nullptr 是未定义的(确实如此),那么编译器就不需要检查指针是否不是 nullptr:它可以假设取消引用的指针永远不会是 nullptr,如果不是,那么任何后果都是程序员的问题。

由于编译器的惊人复杂性,some of those consequences can be rather unexpected .

当然,“任何事情都可能发生”并不是真的。您的计算机既没有必要的物理能力,也没有必要的法律授权来实例化猫体内的黑洞。但由于 C++ 是一种抽象,我们使用抽象来教导人们不要编写具有未定义行为的程序似乎是合适的。如果你严格地编程,假设如果你的程序有未定义的行为“任何事情都可能发生”,那么你不会对所说的意想不到的后果感到惊讶,你也不会试图以任何方式“控制”结果。

关于c++ - 为什么语句是: "undefined behavior means the compiler can do anything it wants" true?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49032551/

相关文章:

compiler-construction - 你如何在 Lisp 编译器中编译宏?

c++ - lambda:应该通过引用捕获 const 引用产生未定义的行为吗?

c++ - 未定义、未指定和实现定义的行为

c++ - (BYTE)-1 是什么意思

c++ - 在我的程序中使用for循环打印出矩阵的一个错误

c++ - 在库 : symbol structure query 上使用 Breakpad

c99 __restrict 和编译器优化

c++ - 当使用可变长度参数列表(...)时,除了通过 va_list 前进之外,您还能做任何事情吗?

使用 Visual Studio 2005 的 C 编译错误

c++ - 元组的一个元素可以引用另一个元素吗?