每日分享 – 基础知识 | 每日一面(76)

古代的剑客们与

对手相逢时,无

论对手多么强大,

明知不敌,也要亮出自己的剑!

读者:我很吃惊, ANSI 标准竟然有那么多没有定义的东西。标准的唯

一任务不就是让这些东西标准化吗?

小林:某些构造随编译器和硬件的实现而变化, 这一直是 C语言的一个特点。这种有意的不严格规定可以让编译器生成效率更高的代码, 而不必让所有程序为了不合理的情况承担额外的负担。因此, 标准只是把现存的实践整理成文。编程语言标准可以看作是语言使用者和编译器实现者之间的协议。协议的一部分是编译器实现者同意提供, 用户可以使用的功能。而其它部分则包括用户同意遵守, 编译器实现者认为会被最受的规则。只要双方都恪守自己的保证, 程序就可以正确运行。如果任何一方违背它的诺言, 则结果肯定失败。

读者:有人说 i = i++ 的行为是未定义的, 但是我刚在一个兼容 ANSI

的编译器上测试, 得到了我希望的结果。

小林:面对未定义行为的时候, 包括范围内的实现定义行为和未确定行为, 编译器可以做任何实现, 其中也包括你所有期望的结果。但是依靠这个实现却不明智。

有时候,正是那些意想不到之人,成就了无人能成之事。

——图灵

正文完