本书用幽默通俗的语言和大量典型的带有Bug的程序,使读者从其他程序员的失误中吸取教训,从而减少自己程序中的错误。全书共分为三大部分:第I部使用幽默风趣的语言,列举了114个不同类型的、含有bug的程序代码, 内容几乎涵盖了C++/C程序中容易产生的各种bug。第II部给出了第I部分114个bug程序代码所涵盖问题的提示,而且提示过程是层层深入,留给读者充分的空间来思考问题的解决方法。第III部给出114个bug程序代码所涵盖问题的答案,对一些非常典型的程序问题还进行了引申,开拓读者的思路。该书适合所有从事C++/C语言开发的程序员,特别是那些常常被bug所困扰的程序员。
特色:
A、目前市场上唯一一本教读者如何不这样编程的书。
B、风趣的书名、经典的Bug程序、幽默通俗的语言。
C、教法独特,先给出Bug程序,再给出多层提示,最后给出答案。
D、该书在国外已经很畅销,国内许多读者知道该书。
第Ⅰ部分 程序 1
第1章 入门 1
1.1 程序1:Hello World 2
1.2 程序2:老师的问题 3
1.3 程序3:清晨的惊奇 5
第2章 初级错误 8
2.1 程序4:典型的初始化问题 8
2.2 程序5:早期错误 9
2.3 程序6:必须为程序保留“空间” 10
2.4 程序7:错误的平方 11
2.5 程序8:“疯狂”的字符 12
2.6 程序9:注释的问题 13
2.7 程序10:蹩脚的除法运算 14
2.8 程序11:画蛇添足 15
2.9 程序12:加快和等待 16
2.10 程序13:问题程序 18
2.11 程序14:移位程序 19
2.12 程序15:没有任何单词是关键字 20
2.13 程序16:事半功倍 22
第3章 字符的奇迹 24
3.1 程序17:又一个Hello World程序 24
3.2 程序18:典型错误 25
3.3 程序19:检查质数 26
3.4 程序20:比设想的情况更简单 27
3.5 程序21:错误的注释 28
3.6 程序22:参数的取值范围过大 29
3.7 程序23:计算字符个数 30
3.8 程序24:过于简单的除法 32
3.9 程序25:最大值的惊奇 33
3.10 程序26:问题区域 34
第4章 常见的问题 36
4.1 程序27:and和and and 36
4.2 程序28:关于零的错误 37
4.3 程序29:低级错误 38
4.4 程序30:关于位的小故障 39
4.5 程序31:数字太小 40
4.6 程序32:重复的问题 41
4.7 程序33:错误的输出 42
4.8 程序34:未考虑分制 43
4.9 程序35:输出一百万 46
4.10 程序36:超出堆栈空间 47
4.11 程序37:程序的故障点 49
4.12 程序38:奇偶测试 51
4.13 程序39:幼儿园算术修订版 52
4.14 程序40:难以置信的精确性 53
4.15 程序41:关于位的小错误 55
4.16 程序42:关于位的另一个故障 56
4.17 程序43:丢失基类函数 57
4.18 程序44:排序问题 59
4.19 程序45:三个数的惊奇 61
4.20 程序46:一切正常吗 62
4.21 程序47:Microsoft的缺陷 64
4.22 程序48:文件错误 66
4.23 程序49:容易中断的链接 68
4.24 程序50:何谓真理 71
4.25 程序51:递增问题 72
4.26 程序52:消失的矩形 74
4.27 程序53:最大值混乱 76
4.28 程序54:从深层开始 77
4.29 程序55:羊群计数程序 79
4.30 程序56:程序的魔法失效 80
4.31 程序57:无法读取文件 83
4.32 程序58:奇怪的文件名之一 84
4.33 程序59:奇怪的文件名之二 85
4.34 程序60:奇怪的文件名之三 87
4.35 程序61:慢吞吞的字典 88
4.36 程序62:邮政编码问题 94
第5章 C语言代码bug 96
5.1 程序63:姓名游戏 96
5.2 程序64:别样的π 97
5.3 程序65:临时文件混乱 98
5.4 程序66:丢失缓冲 99
5.5 程序67:捉迷藏 100
5.6 程序68:误算 101
5.7 程序69:求和问题 103
5.8 程序70:太简单的2 104
5.9 程序71:不能同步 105
5.10 程序72:无边的字符 107
第6章 预处理错误 109
6.1 程序73: 不是指针类型 109
6.2 程序74:总计错误 110
6.3 程序75:快速退出 111
6.4 程序76:“翻倍”的麻烦 112
6.5 程序77:没有value 113
6.6 程序78: 边距错误 114
6.7 程序79: 平方错误 115
6.8 程序80:面积剧增 116
第7章 没有类的类 118
7.1 程序81:感谢内存 118
7.2 程序82:数组消失的情形 120
7.3 程序83:疯狂的输出 122
7.4 程序84:构造函数 123
7.5 程序85:超长队列 124
7.6 程序86:缺乏自我保护 128
7.7 程序87:另类异常 131
7.8 程序88:文件输出错误 135
7.9 程序89:徒劳无功 137
7.10 程序90:像输出日志一样简单 140
7.11 程序91:堆栈错误 142
7.12 程序92:文件名游戏 146
7.13 程序93:没有魔术 147
7.14 程序94:速度杀手 150
7.15 程序95:发送错误消息 157
7.16 程序96:有趣的事情 158
第8章 专家的迷惑 162
8.1 程序97:再现Hello 162
8.2 程序98:控制调试器 163
8.3 程序99:幻影文件 164
第9章 地狱之门 165
9.1 程序100:失落的Rio 165
9.2 程序101:无返回指针 167
9.3 程序102:邮政编码问题 168
第10章 几个工作程序 170
10.1 程序103:快速交换 170
10.2 程序104:没什么可奇怪的 170
10.3 程序105:变动的flag 172
第11章 可怕的线程和嵌入式程序 173
11.1 程序106:清除缓冲区垃圾 173
11.2 程序107:更好的垃圾收集器 174
11.3 程序108:短时延之一 175
11.4 程序109: 短时延之二 176
11.5 程序110:短时延之三 177
11.6 程序111:读写冲突 178
11.7 程序112:运行与等待 181
11.8 程序113:浮动的标记 184
11.9 程序114:缓慢的进展 187
第Ⅱ部分 提示 191
第Ⅲ部分 答案 227
磨难往往是很好的一种学习方法。当您因失误而备受折磨时,很自然地会说“早知如此,何必当初!”如果您是一个程序员,肯定经历过这样的痛苦:在凌晨两点,当您费尽周折找到程序中的最后一个bug时,身心已疲惫不堪,因为您已经为此付出了两个星期的代价。
本书列举了大量有bug的程序,这些程序将有助于您从其他程序员的失误中吸取教训,从而减少自己程序中的bug。这些程序中的bug都是大部分程序员可能会遇到的常见bug,能够给您带来实际的编程体验。
在设计本书所列出的程序时,我们尽可能地做到使它们接近于实际的程序。每一个程序都力图完成一项简单的任务或执行一个简单的C++语言功能。虽然这些程序都不能运行,但它们的代码都较短,这样您就不必在一个拥有7.5万行的程序中寻找bug。
许多IT人士都知道,现在市场上有很多新的编译器,它们可以捕获大部分程序错误。但遗憾的是,仍有许多错误是编译器不能发现的。打个比方,拼写检查程序是用来查找拼写错误的。但是,如果单词DOG被错误地写为CAT,您能指出单词CAT(实际是DOG)中的拼写错误吗?很显然,不能。因为这个单词可顺利通过拼写检查程序。
因此请体验寻找程序中错误的乐趣。如果您在找错的过程中陷入困境,本书所提供大量的提示会帮助您找到问题之所在,而且最后还给出了答案。
需要提请您注意的是,实际的编程过程与本书中的学习安排是完全不同的,其中不可能存在任何错误提示,更不可能给出解决问题的答案。因此,您一定要掌握这些程序中的常见错误,力争在自己的程序中不会出现这些错误,从而提升自己的代码开发效率和软件质量。这也是本书的主要目的。