代码之家  ›  专栏  ›  技术社区  ›  GermanNerd sneha maganahalli

“未定义的行为”和“实现定义的行为”有什么区别,或者为什么还要区分它们?[副本]

  •  0
  • GermanNerd sneha maganahalli  · 技术社区  · 7 年前

    C标准(AFAIK)同时使用这两个术语。我很难理解两者的区别在哪里。

    如果我有任何给定的、语法正确的C语句,编译器就不可能不发出某些机器指令。当然,它可以选择根本不发表任何声明,但即便如此,也将是“取决于执行情况”。

    一个更具体的例子:整数值溢出。现在我们有两种溢出类型:算术溢出和内存溢出。如果有符号整数的溢出按照标准是UB,这意味着什么?实现能否简单地将溢出位溢出到MSB的相邻字节中?(从来没见过,但可以吗?)

    在我看来,“未定义的行为” 总是 取决于实现。或者,换言之,编译器似乎无法在不引入“实现定义”行为的情况下处理任何“未定义行为”。

    那为什么还要区分两者呢?

    1 回复  |  直到 7 年前
        1
  •  4
  •   Basile Starynkevitch    7 年前

    主要区别在于定义了实现定义的行为。也就是说,对于标准中每一个说“实现定义”的需求,C实现都应该附带对该行为的解释。

    例如, here 是关于C语言的实现定义行为的GCC文档。

    此外,在许多情况下,“实现定义”允许对许多特定的可能行为中的一个做出决定。但“未定义的行为”总是允许实现在编译时或运行时执行任何操作。

    同时阅读拉特纳的博客 What Every Programmer Should Know About Undefined Behavior .

    推荐文章