绝密笔记 | 基础知识 | 每日一练(105)

士人有百折不回之真心,才有万变不穷之妙用。立业建功,事事要从实地着脚,若少慕声闻,便成伪果;讲道修德,念念要从虚处立基,若稍计功效,便落尘情。 ——菜根谭

学生:为什么声称兼容 ANSI 的 Frobozz Magic C 编译器不能编译这些代码?我知道这些代码是 ANSI 的, 因为 gcc 可以编译。

小林:许多编译器都支持一些非标准的扩展, gcc 尤甚。你能确认被拒绝的代码不依赖这样的扩展吗?通常用试验特定的编译器来确定一种语言的特性是个坏主意;使用的标准可能允许变化, 而编译器也可能有错。

学生:好像有些在意实现定义 (implementation-defin-ed)、未明确 (unspecified) 和无定义 (undefined) 行为的区别。它们的区别到底在哪里?

小林:简单地说: 实现定义意味着实现必须选择某种行为并提供文档。未明确意味着实现必须选择某种行为但不必提供文档。未定义意味着任何事情都可能发生。标准在任何情况下都不强加需求; 前两种情况下, 它有时建议一组可能的行为 (也可能要求从中选择一种)。

注意既然标准对无定义行为没有强制要求, 编译器就绝对可以做任何事情。特别地, 对程序其它部分的正常运行没有任何保证。

正文完