C标准(AFAIK)使用这两个术语。我很难理解两者的区别在哪里。
如果我有任何语法正确的给定C语句,那么编译器将不会发出一些机器指令。当然,它可以选择根本不发出任何声明,但是即使那样也将是“依赖于实现的”。
一个更具体的示例:整数值溢出。现在,我们有两种类型的溢出:算术溢出和内存溢出。如果按照标准,有符号整数的溢出是UB,那是什么意思?一种实现方式可以简单地将溢出位溢出到MSB的相邻字节中吗? (从未见过,但是可以吗?)
在我看来,“不确定行为” 总是取决于实现。或者换句话说,如果不引入“实现定义的”行为,编译器似乎无法处理任何“未定义的行为”。
那为什么还要区分两者呢?
答案 0 :(得分:4)
主要区别在于定义了实现定义的行为。也就是说,对于该标准中每个“实现定义”的要求,都应该在C实现中附带说明该行为的含义。
例如,here是有关C语言实现定义的行为的GCC文档。
而且,在许多情况下,“实现定义的”允许对许多特定的可能行为之一进行决策。但是“未定义的行为”始终允许实现在编译时或运行时根本不执行任何操作。
也请阅读Lattner的博客What Every Programmer Should Know About Undefined Behavior。