《高质量程序设计指南——C++/C》(第三版)最新修订

技术文章 专栏收录该内容
24 篇文章 0 订阅
1.Page 7:倒数第13行,“啰里啰唆”印刷有点儿问题;
2.Page 15:表1-2有些许印刷问题;
3.Page 56:“4.3 类型转换”一节上面一段末尾应从“关于复合...”处另起一行;
4.Page 58:示例4-6,代码用下列代码替换:
 
  5.Page 76:示例4-13上半部分最后一行“delete a[];”要右移4格对齐;下半部分最后一行左移4格对齐;
6.Page 81:示例4-20中的注释/*第三条...*/修改为/*第二条...*/;
7.Page 82:将例4的内容整个替换为:
例4:协助破案。假设已经查清,有A、B、C、D、E五个嫌疑人可能参与制造了一起银行抢劫案,但是不知道其中到底哪几个人是真正的案犯。不过,有确凿证据表明:
    ① 如果A参与了作案,则B一定也会参与。
    ② B和C两人中只有一人参与了作案。
    ③ C和D要么都参与了作案,要么都没有参与。
    ④ D和E两个人中至少有一人参与作案。
    ⑤ 如果E作案,则A和D一定参与作案。
是不是有点绕口?我们可以用数理逻辑中的正规表达式来表示上述论断:
    ①   A→B
    ② (B∧ C)∨( B∧C)
    ③ (C∧D)∨( C∧ D)
    ④ (D∨E)
    ⑤   E→(A∧D)
我们现在用1(可理解为TRUE)表示作案,0(可理解为FALSE)表示未作案,则每个人的取值范围就是{0,1}。然后我们在5个人取值的所有可能的组合空间中进行搜索,如果某个组合同时满足这5条线索,那么它就是本案的答案了。于是,上述正规表达式可以进一步表示为下列C++/C逻辑表达式:
    ① A == 0 ||(A == 1 && B == 1)
    ② B + C == 1
    ③ C == D
    ④ D + E >= 1
    ⑤ E == 0 ||(E == 1 && A == 1 && D == 1)
我们用另一个变量count来表示组合空间中某一个组合能够满足几条论断,如果出现了这样一个组合:它同时满足了这5条论断,那么它就是我们要找的组合。程序见示例4-21。
                                                    示例4-21
 
      [注:] 这个例子的另一个更直接的解法参见文章“关于《高质量》第三版第4.13节例4的更正!”。
8.Page 83:在“最后我们举一个数值计算...。”一行前面插入“例5:数值计算。”;
9.Page 88:[建议5-1]中的示例代码:两个MAX和PI应该垂直对齐,后面的注释也垂直对齐;
10.Page 91:“C++程序”所在一行中:右边的[方法二]和左边的[方法二]要水平对齐,调整后后面的[方法三]和[方法四]也要分别与左边的[方法三]和[方法四]水平对齐;
11.Page 93:倒数第10行,将“…定义和初始化每一个常量时,一次一个样。”修改为“…定义和初始化每一个常量一次。”;
12.Page 96:示例6-1:将“T是形参”修改为“_T是形参”;
13.Page 107:示例6-8中,后面的注释行要垂直对齐;
14.Page 122:示例7-1中,所有“cout <<...”行中的“:0x”要垂直对齐;
15.Page 144:示例8-5右半边“char ch; ”一行要缩进4格垂直对齐;
16.Page 147:上方代码中最后一个“:8”中间插入一个空格;
17.Page 149:示例8-9中,将“sizeof(X) = 4”修改为“sizeof(X) = 8”;
18.Page 154/155:图8-6和图8-7中m_price的长度应该是8字节而不是4字节,这是个笔误。修正后的图参见相册中的图8-6和图8-7。
19.Page 167:第(7)条中,“#define SQUARE(x)((x)*(x))”中间要插入几个空格,即修改为“#define  SQUARE(x)    ((x)*(x))”;“#define SQUARE(x)x * x”的中间也插入几个空格,即修改为“#define SQUARE(x)     x * x”;
20.Page 168:第(8)条中,把“否则将导致变量的多次求值”修改为“否则可能导致变量多次求值,且结果可能与预期不符,因为复合表达式中子表达式的求值顺序可能因具体编译器的不同而不同。”;
21.Page 168:第(8)条中,把“其结果将是30而不是期望的25,这是因为展开的结果为:int x = ((n++) * (n++));”修改为“其结果可能是30,但也可能是25。”;
22.Page 170:示例9-2中,将下列代码:
 
 
23.Page 181:[建议10-5]中,把“/t”修改为‘/t’;
24.Page 183:示例10-6用下面的代码替换:
 
25.Page 193:示例12-3的代码用下面的代码替换:
 
26.Page 196:示例12-6中,三个class所在行对齐有问题,后面两个class行要左移4空格垂直对齐;
27.Page 199:图12-1用相册中的图12-1替换(原图没有使用斜体)。
28.Page 200:示例12-11中,class Eye的“public:”所在行左移4格垂直对齐,同时void行向右缩进4格;同时正数第13行“...返回其中任意一个接口指针”修改为“...返回其中任意一个接口的指针”;
29.Page 201:上方class Head的private部分以m_打头的部分要垂直对齐;
30.Page 207:倒数第12和13行,请把“//(3)”和“// OK!”垂直对齐;
31.Page 210:示例12-19,最后一行向左移4格垂直对齐;
32.Page 233:上方“class B”行向左移4格垂直对齐;
33.Page 270:把示例15-3中第8行到第13行分别左移4格;
34.Page 275:把[建议15-1]中的“比如反跟踪”修改为“(比如反跟踪)”;
35.Page 297:示例16-10:最后的“catch”一行向左移4格对齐;
36.Page 301:正数第6行末尾句号改为冒号;
37.Page 309:把“…必须派生自类似于接口IUnknown类”修改为“…必须派生自类似于接口IUnknown的类”;
38.Page 309:将图16-1用相册中的图16-1替换。
39.Page 310:示例16-22中间“strVect.insert(…);”、“}”和“…”所在的三行都分别右缩进4格;
40.Page 310:将“而不是真正数据”修改为“而不是真正的数据”;将“…指针元素指向对象”修改为“…指针元素所指对象”;
41.Page 317:最后一行末尾句号修改为冒号;
42.Page 320:示例16-30,把“void func()”和“{”两行左移4格对齐;
43.Page 320:示例16-31中,把最后一行右缩进4格对齐;
44.Page 333:正数第15行末尾句号改为冒号;
45.Page 341:倒数第9行末尾句号改为冒号;
46.Page 343:示例17-7用下面的代码替换:
 
 
47.Page 348:将“顾名思义”这一段第二行的“输出功能”改为“输入/输出功能”;
48.Page 357:图17-12存在一些问题,不知道是印刷问题还是绘图有问题。修正后的图参见相册中的图17-12。
49.附录E:“POD”所在行右边中文解释没有对齐,只需在末尾换行即可。
  • 1
    点赞
  • 33
    评论
  • 5
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

这是C语言学习不错的文档,第1章 文件结构 1.1 版权和版本的声明 1.2 头文件的结构 1.3 定义文件的结构 1.4 头文件的作用 1.5 目录结构 第2章 程序的版式 2.1 空行 2.2 代码行 2.3 代码行内的空格 2.4 对齐 2.5 长行拆分 2.6 修饰符的位置 2.7 注释 2.8 类的版式 第3章 命名规则 3.1 共性规则 3.2 简单的WINDOWS应用程序命名规则 3.3 简单的UNIX应用程序命名规则 第4章 表达式和基本语句 4.1 运算符的优先级 4.2 复合表达式 4.3 IF 语句 4.4 循环语句的效率 4.5 FOR 语句的循环控制变量 4.6 SWITCH语句 4.7 GOTO语句 第5章 常量 5.1 为什么需要常量 5.2 CONST 与 #DEFINE的比较 5.3 常量定义规则 5.4 类中的常量 第6章 函数设计 6.1 参数的规则 6.2 返回值的规则 6.3 函数内部实现的规则 6.4 其它建议 6.5 使用断言 6.6 引用与指针的比较 第7章 内存管理 7.1内存分配方式 7.2常见的内存错误及其对策 7.3指针与数组的对比 7.4指针参数是如何传递内存的? 7.5 FREE和DELETE把指针怎么啦? 7.6 动态内存会被自动释放吗? 7.7 杜绝“野指针” 7.8 有了MALLOC/FREE为什么还要NEW/DELETE ? 7.9 内存耗尽怎么办? 7.10 MALLOC/FREE 的使用要点 7.11 NEW/DELETE 的使用要点 7.12 一些心得体会 第8章 C++函数的高级特性 8.1 函数重载的概念 8.2 成员函数的重载、覆盖与隐藏 8.3 参数的缺省值 8.4 运算符重载 8.5 函数内联 8.6 一些心得体会 第9章 类的构造函数、析构函数与赋值函数 9.1 构造函数与析构函数的起源 9.2 构造函数的初始化表 9.3 构造和析构的次序 9.4 示例:类STRING的构造函数与析构函数 9.5 不要轻视拷贝构造函数与赋值函数 9.6 示例:类STRING的拷贝构造函数与赋值函数 9.7 偷懒的办法处理拷贝构造函数与赋值函数 9.8 如何在派生类中实现类的基本函数 9.9 一些心得体会 第10章 类的继承与组合 10.1 继承 10.2 组合 第11章 其它编程经验 11.1 使用CONST提高函数的健壮性 11.2 提高程序的效率 11.3 一些有益的建议
©️2021 CSDN 皮肤主题: 大白 设计师:CSDN官方博客 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值