最新消息:XAMPP默认安装之后是很不安全的,我们只需要点击左方菜单的 "安全"选项,按照向导操作即可完成安全设置。

C必读书籍推荐《C陷阱与缺陷》学习笔记

XAMPP教程 admin 339浏览 0评论

ew090

1、参考资料

  • 《C陷阱与缺陷》内容提要;
  • 《C陷阱与缺陷》作者简介;
  • 《C陷阱与缺陷》中文版序;
  • 《C陷阱与缺陷》18 次印刷的奇迹;

 

2、内容提要

1、作者写作本书的出发点:不是为了批判 C 语言,而是要帮助 C 程序员绕过编程过程中的陷阱和障碍;

2、全书分为 8 章,分别从如下几个方面分析了 C 编程中可能遇到的问题;

  • 词法分析
  • 语法语义
  • 连接
  • 库函数
  • 预处理器
  • 可移植性缺陷

3、本书适合读者:

  • 适合有一定经验的 C 程序员阅读学习
  • C 编程高手(也应该成为案头必备书籍)

 

3、作者简介

1、作者姓名:Andrew Koenig ;

2、贝尔实验室;

3、《C陷阱与缺陷》《C++沉思录》

4、多年 C++ 开发、研究和教学经验;

5、亲身参与 C++ 的演化和变革,对 C++ 的变化和发展起到重要的影响;

6、等等其他;

 

4、中文版序(2002年10月)

1、写这本书,到 14 年后仍在印行!

2、之所以历久不衰,可能是书中道出了 C 语言编程中一些重要的经验教训。而且到现在,这些教训也还没有广为人知。

3、其他一些作者可能会这样认为

  要成为一个优秀的程序员,最重要的无非是学习一种特定程序语言、函数库或者操作系统的细节,而且多多益善。此观念不无道理,但也有偏颇之处。

  掌握细节并不难,一本索引丰富完备的参考书就已经足矣;最多,可能还需要一位稍有经验的同事从旁不时点拨,指明方向。

  难的是那些我们已经了解的东西,如何 “运用之妙,存乎一心” 。

4、学习哪些是不应该做的,倒不失为一条领悟运用之道的路子。

5、研究一种语言中程序员容易犯错之处,不但可以 “前车之履,后车之鉴” ,还能使我们更谙(an)熟这种语言的深层运作机制。

 

5、18次印刷的奇迹

1、想要学好一门编程语言,应该阅读什么样的书籍呢?

  大多数场合都会推荐市面上最新出版的书籍。

  原因:以现在计算机领域内技术的发展速度,几乎是每隔一段时间,我们就需要对自己现有的知识进行更新,这样看来,使用一本比较新的书籍,里面的内容将会比较贴近当前技术的发展,因而也就能够让你更容易掌握你要学的东西。

 

2、这是一本讲述 C 语言的书籍,对于 C++ 的学习者来说,是否也有同样的价值呢?另外,现在 C 语言的最新标准已经很新了,作为一本在 C89 之前出版的 C 语言书籍,作用是否还和以前一样大呢?

  肯定有价值。英文版连续印刷 18 次。

  实际上,C++ 在那个层面上和 C 的区别并不大,在 C 程序中常犯的错误通常在 C++ 程序中也经常得以重现。

此外,虽然最新的标准较之前有了一些变化,但在较低层次(如词法、语法)上,几乎没有差别。

 

6、分析

  1. 简要了解本书的基本信息、作者简介、内容概括;
  2. 简要了解文章中心主旨,作者用意等;
  3. 全书已经读过一遍了,给我的感觉就是一句话:“在记笔记的时候,感觉书中没有一句废话,全都是有用的!”。

a1 书籍节选

  • 《C陷阱与缺陷》,第 2.2 节,P19 ;

a2 问题描述(摘自原文内容)

  假设存在一个已定义的常量 FLAG ,FLAG 是一个整数,且该整数值的二进制表示中只有某一位是 1 ,其余各位均为 0 ,亦即该整数是 2 的某次幂。如果对于整型变量 flags ,我们需要判断它在常量 FLAG 为 1 的那一位上是否同样也为 1 ,通常可以这样写:

if(flags & FLAG)
{
    //...
}

  上式的含义对大多数 C 程序员来说是显而易见的:if 语句判断括号内表达式的值是否为 0 。考虑到可读性,如果对表达式的值是否为 0 的判断能够显式地加以说明,无疑使得代码自身就起到了注释该段代码意图的作用。其写法如下,

if(flags & FLAG != 0)
{
    //...
}

  这个语句现在虽然更好懂了,但却是一个错误的语句。因为 != 运算符的优先级要高于 & 运算符,所以上式实际上被解释为:

if( flags & (FLAG != 0) )
{
    //...
}

  因此,除了 FLAG 恰好为 1 的情形,FLAG 为其他数时这个式子都是错误的。

a3 第一次错误理解

  其实原文的内容,就是想表达一下运算符 != 与 & 的优先级问题,如果我们不注意的话,就会产生意外的错误!

  只是我自己在看的时候,最后一句话,愣是没反应过来,纠结在为什么除了 1 就都是错的呢?

因此,除了 FLAG 恰好为 1 的情形,FLAG 为其他数时这个式子都是错误的。

  刚开始我是这样理解的,我自己针对如下情况举了个例子

if( flags & (FLAG != 0) )
{
    //...
}

// 假定 FLAG 为 2
FLAG = 2;

// 则下式为真,即为 1 
FLAG != 0;

// 则只需要 flags 也为 1 ,
// 整个 if 语句就为真;
flags & (FLAG != 0)

  我还在想,只要 flags 为 1 ,就能满足条件了呀?为什么非要说 FLAG 恰好为 1 呢?

a4 第二次错误理解

  还是顺着上面的思路,我看了看刚开始的描述,注意到这么一句话:“我们需要判断它在 常量 FLAG 为 1 的那一位上是否同样也为 1 ”,嗷~,原来常量 FLAG 需要为 1 啊?

  诶,这不对啊,如果刚开始 FLAG 就为 1 ,那后续所有的式子,都能成立啊,为什么后边单独又说:”FLAG 恰好为 1 才行呢?“

a5 第三次理解

  于是我就反反复复的读,来来回回的审题,突然发现,我原来好像都理解错了啊???

  原文是这样说的:

如果对于整型变量 flags ,我们需要判断它在常量 FLAG 为 1 的那一位上是否同样也为 1

  重点在这:FLAG 为 1 的那一位上,那照这么说,FLAG 应该等于 2 啊!第 0 位是 1 ,第 1 位是 2 。

  我悟了,悟了,悟了……

  那照这样说,就解释的通了!我们要明白我们的本意,我们是要干嘛?是要判断什么?我们的本意是:判断变量 flags 在 FLAG 为 1 的那一位上,是否也为 1 ?也就是 flags 与 FLAG 是否相等即可?

  对于如下这个表达式,只有当 FLAG 等于 1 时,flags 才能等于 FLAG ;

if( flags & (FLAG != 0) )
{
    //...
}

  我自己又画了一个表格, 这样看的更清楚一些

FLAG (FLAG != 0) flags FLAG == flags
1 1 1 相等
2 1 1 不相等
5 1 1 不相等

  到这里,就明白了书上说的,“除了 FLAG 恰好为 1 的情形,FLAG 为其他数时这个式子都是错误的。”

a6 总结

  1. 一定要认真读题,理解题意;
  2. 要了解前置信息,明白我们要干什么?了解我们最根本的目的;
  3. 当自己的理解有偏差、遇到问题就是想不明白时,即刻暂停,好好的回归一下初心!
  4. 加油小伙砸!

转载请注明:XAMPP中文组官网 » C必读书籍推荐《C陷阱与缺陷》学习笔记

您必须 登录 才能发表评论!