本节书摘来自异步社区《C专家编程》一书中的第1章,第1.6节,作者 【美】Perter Van Der Linde,更多章节内容可以访问云栖社区“异步社区”公众号查看

1.6 它很棒,但它符合标准吗

不要添乱——立即解散ISO工作小组。

——匿名人士

ANSI C标准可以说是非常独特的,我们可以从好几个有趣的方面来说明这一点。它定义了下面一些术语,用于描述某种编译器的特点。如果你对这些术语有一个比较好的了解,就有助于你理解什么东西能被语言接受,什么东西不能被语言接受。前两个术语涉及不可移植的代码(unportable code),接下来的两个术语跟坏代码(bad code)有关,而最后两个术语则跟可移植的代码(portable code)有关。

不可移植的代码(unportable code):

由编译器定义的(implementation-defined)——由编译器设计者决定采取何种行动(就是说,在不同的编译器中所采取的行为可能并不相同,但它们都是正确的),并作好文档记录。

例如:当整型数向右移位时,要不要扩展符号位。

未确定的(unspecified)——在某些正确情况下的做法,标准并未明确规定应该怎样做。

例如:参数求值的顺序。

坏代码(bad code):

未定义的(undefined)——在某些不正确情况下的做法,但标准并未规定应该怎样做。你可以采取任何行动,可以什么也不做,也可以发出一条警告信息,或者可以中止程序以及让CPU陷入瘫痪,甚至可以发射核导弹(只要你安装了能发射核弹的硬件系统)。

例如:当一个有符号整数溢出时该采取什么行动。

约束条件(a constraint)——这是一个必须遵守的限制或要求。如果你不遵守,那么你的程序的行为就会变成像上面所说的属于未定义的。这就出现了一种很有意思的情况:分辨某种东西是否是一个约束条件是很容易的,因为标准的每个主题都附有一个“约束(constraint)”小节,列出了所有的约束条件。现在又出现了一个更为有趣的情况:标准规定[5]编译器只有在违反语法规则和约束条件的情况下才能产生错误信息!这意味着所有不属于约束条件的语义规则你都可以不遵循,而且由于这种行为属于未定义行为,编译器可以采取任何行动,甚至不必通知你!

例如:%操作符的操作数必须属于整型。所以,在非整数数据上使用%操作符肯定会引发一条错误信息。

不属于约束条件规则的例子:所有在C语言标准头文件中声明的标识符均保留,所以不能声明一个叫作malloc()的函数,因为在标准头文件里已经有一个函数以此为名。但由于这个规定不是约束条件,因此可以违反它,而且编译器甚至可以不警告你!关于“interpositioning”这一小节的更多内容,参见第5章。


未定义的行为在IBM PC中引起CPU瘫痪!

未定义的软件行为引起CPU瘫痪的说法并不像它乍听上去那样牵强。

IBM PC的显示器以显示控制芯片所提供的水平扫描速率工作。回扫变压器(flyback transformer,一种产生高电压的装置,用于加速电子以点亮显示器上的荧光物质)需要保持一个合理的频率。

然而在软件中,程序员有可能把视频芯片的扫描速率设置成零,这样就会产生一个恒定的电压输出到回归变压器的输入端。这就使它起了电阻器的作用,只是把电能转换成热能,而不是传送到屏幕。这会在数秒之内就把显示器烧毁,那就是未定义的软件行为会导致系统瘫痪的理由。
可移植的代码(portable code):

严格遵循标准的(strictly-conforming)—— 一个严格遵循标准的程序应该是:

只使用已确定的特性。

不突破任何由编译器实现的限制。

不产生任何依赖由编译器定义的或未确定的或未定义的特性的输出。

这样规定的主要目的就是最大限度地保证可移植性。这样,不论你在什么平台上运行严格遵循标准的程序都会产生相同的输出。事实上,在所有遵循标准的程序中,属于这一类的程序并不多。例如,下面这个程序就不是严格遵循标准的:

#include <limits.h>
#include <stdio.h>
int main() { (void)printf("biggest int is %d", INT_MAX); return 0;}/*并不严格遵循标准:其输出结果是由编译器定义的。*/

在本书的剩余部分,我们通常并不强求例子程序严格遵循标准。因为如果这样做会使文本看上去比较乱,而且不利于理解所讨论的要点。程序的可移植性是非常重要的,所以在你的现实编码中,应该始终要保证加上必要的类型转换、返回值等。

遵循标准的(conforming)——一个遵循标准的程序可以依赖一些某种编译器特有的不可移植的特性。所以,一个程序有可能在一个特定的编译器里是遵循标准的,但在另一个编译器里却是不遵循标准的。它可以进行扩展,但这些扩展不能修改严格遵循标准的程序的行为。但是,这个规则并不是一个约束条件,所以对于你的程序中不遵循标准之处,你不要指望编译器会给出一条警告信息指出你违反了规定!

上面所举的几个程序实例都是遵循标准的。

《C专家编程》一1.6 它很棒,但它符合标准吗相关推荐

  1. C专家编程-读书笔记(书本顺序)

    C语言设计哲学:   一切工作程序员自己负责.   语言中的所有特性都不需要隐式的运行时支持.   程序员所做的都是对的.   程序员应该知道自己在干什么,并保证自己的所作所为是正确的. ====== ...

  2. 《C专家编程》读书记录

    其实,这本书适合没事的时候翻翻,随便打开哪一页,应该都可以看下去的.总体来说,写的比较欢脱,不像<C和指针>和<C陷阱和缺陷>的章节标题那么严肃,有时候还以为自己在看科技杂志. ...

  3. c专家编程/c陷阱_如何避免常见的初学者陷阱并像专家一样开始编码

    c专家编程/c陷阱 by Dmitri Grabov 德米特里·格拉波夫(Dmitri Grabov) 如何避免常见的初学者陷阱并像专家一样开始编码 (How to avoid common begi ...

  4. 一篇特别长的总结(C专家编程)

    博客链接: http://codeshold.me/2017/02/expert_c_programming.html 读一本书必输出一篇笔记或者总结!!! <C专家编程>这本书很早看完了 ...

  5. 《C陷阱与缺陷》和《C专家编程》两本书又翻印了

    今天花了几个小时逛书店,偶然让我发现了<C陷阱与缺陷>和<C专家编程>这两本书.这让我很惊喜,喜欢收集书的我当然不会错过,一口气,两本书都收录了. 其实这两本我都已经下载了电子 ...

  6. 《JavaScript专家编程》——第1章 对象和原型 1.1鸟瞰JavaScript

    本节书摘来自异步社区<JavaScript专家编程>一书中的第1章,第1.1节,作者:[美]Mark Daggett(达格特)著,更多章节内容可以访问云栖社区"异步社区" ...

  7. 《C专家编程》随笔1:读者心得

    自己在阅读完<C和指针>和<C陷阱与缺陷>之后,结合实际的项目,对C语言有了一定熟悉. <C和指针>是一本非常不错的C语言基础书,详细介绍了C语言的知识点,相对于谭 ...

  8. c语言多态性编码图形,C和C++经典著作 C专家编程Expert C Programming Deep C Secrets pdf...

    摘要 <C专家编程>可以帮助有一定经验的C程序员成为C编程方面的专家,对于具备相当的C语言基础的程序员,<C专家编程>可以帮助他们站在C的高度了解和学习C++.书本撷取了几十个 ...

  9. C专家编程(Expert C Programming)1

    C专家编程(Expert C Programming) 一基本概念 1.与时间相关的几个函数 char *ctime( const time_t *timer ); Each of these fun ...

最新文章

  1. 后台开发技术--接入层设计
  2. python编程100行_自己动手写100行Python代码抢火车票!
  3. Oracle数据库—— 事务处理与并发控制
  4. Redis内存分析工具
  5. bzoj 5248: [2018多省省队联测]一双木棋
  6. python将数据写入excel_【Python】将数据库中的数据查询出来自动写入excel文档
  7. 【Flink】Flink写入es报错failed to get node info for request_id time out out after
  8. git和python交互_使用Python连接和执行GIT命令
  9. DataGridView使用技巧一:获取或设置当前单元格的内容
  10. webApi2 上传大文件代码
  11. 浅谈语音识别技术的发展趋势与应用前景
  12. jms.jar 2.0_JMS API概述:JMS 1.x和JMS 2.x
  13. lambda表达式python_python lambda表达式用法
  14. 【数字信号调制】基于matlab实现AM调制系统附GUI界面
  15. bootstrap-tagsinput操作标签对象,实现从表格中选人和移除
  16. 六方面的学习,帮你走上业务架构师之路
  17. 国外Flash源码的汉化
  18. 彻底删除已经下载安装好的Mysql
  19. 100集华为HCIE安全培训视频教材整理 | Agile Controller终端安全管理特性(七)
  20. 基于pytorch的MNIST数据集的四层CNN,测试准确率99.77%

热门文章

  1. FreeRTOS在STM32F429上移植
  2. Hibernate中hql的基本查询、条件查询、排序插叙、分页查询、投影查询
  3. The security settings could not be applied to the database because the connection has failed安装Mysql
  4. 百度地图infowindow的close事件_百度地图蒙圈:车主要加油误导母婴店 跑偏理由令人啼笑皆非...
  5. python接口和抽象类的区别_接口和抽象类有什么区别?
  6. java静态类和非静态类的区别_Java中静态内部类和非静态内部类到底有什么区别?...
  7. 循环队列基本操作(解决队列假溢出)
  8. C++:Vector和List的实现
  9. 大厂也在用的6种数据脱敏方案,醍醐灌顶!
  10. 阿里P8亲自讲解!java实例变量和类变量