本书分为上下两篇,上篇介绍了C语言程序设计中经常遇到的典型错误,其中不乏编程高手也经常会出现的错误。下篇主要从程序的质量出发,针对能够运行但质量不佳的程序或者设计方法,提出改进的建议。使读者完成从会编程到编出好程序的转变。
封面图
目录
- 前言
- 第一篇C语言编程中的对与错
- 第1章初涉C语言者的困惑2
- 1.1中文字符以假乱真2
- 1.2象形字体扰乱视听3
- 1.3都是注释惹的祸4
- 1.4千万不要忘记我4
- 1.5别把分号放错地方4
- 1.6少了花括号就是行不通6
- 1.7scanf要“&”不要“\n”6
- 1.8老大就是要在最前面6
- 1.9记住我就会受益无穷7
- 第2章用好printf和scanf一对活宝9
- 2.1printf输出的小奥妙9
- 2.2printf输出整数或字符11
- 2.3输入的格式配对错误12
- 2.4空格让scanf莫名其妙14
- 2.5回车键打乱scanf的阵脚15
- 2.6字符输入要搞特殊化15
- 2.7别混淆字符数组和字符17
- 2.8一维数组更要特殊对待19
- 2.9输出值的操作符20
- 2.10 引入指针更方便23
- 2.11 指针的困惑24
- 第3章基本数据类型26
- 3.1混合运算要小心26
- 3.2数据类型的后缀符号28
- 3.3基本数据的初始化28
- 3.4注意编译系统的差别29
- 3.5不要用错等于运算符30
- 3.6不要用错逗号运算符31
- 第4章程序控制语句34
- 4.1控制流程运算容易出现的问题34
- 4.1.1写错关系运算符34
- 4.1.2混淆表达式和关系表达式的值36
- 4.1.3混淆逻辑表达式和逻辑表达式的值37
- 4.1.4混淆逻辑运算符和位运算符38
- 4.2程序控制语句容易出现的问题39
- 4.2.1条件分支语句的错误39
- 4.2.2控制重复的分支语句44
- 4.2.3运算符优先级错误53
- 4.2.4求值顺序55
- 第5章数组与指针是重点58
- 5.1一维数组越界和初始化错误58
- 5.1.1一维数组越界错误58
- 5.1.2一维数组初始化错误60
- 5.2数组赋值错误61
- 5.3指针地址的有效性64
- 5.4配合使用一维数组与指针69
- 5.4.1使用一维数组名简化操作69
- 5.4.2使用指针操作一维数组71
- 5.4.3使用一维字符数组78
- 5.4.4不要忘记指针初始化79
- 5.5多维数组与指针81
- 5.5.1数组操作及越界和初始化错误81
- 5.5.2二维数组与指针85
- 5.5.3二维数组与指向一维数组的指针89
- 第6章函数是核心91
- 6.1函数的声明与定义91
- 6.2函数变量的作用域93
- 6.3函数变量类型的匹配95
- 6.4函数的返回路径95
- 6.5函数参数的设计及传递96
- 6.6传递指针不一定改变原来参数的值98
- 6.7函数的返回值99
- 6.7.1无返回值的void类型函数100
- 6.7.2函数返回值问题102
- 第7章宏与const106
- 7.1用const代替无参数的宏定义106
- 7.2有参数的宏定义109
- 第8章库函数112
- 8.1引用的库函数与头文件不匹配112
- 8.2与库函数的参数类型不匹配113
- 8.3对库函数的作用理解不对114
- 8.4充分利用库函数printf的功能118
- 8.4.1printf的函数原型119
- 8.4.2printf函数的格式控制符120
- 第9章结构134
- 9.1结构定义和赋值错误134
- 9.2结构作为函数参数及函数的返回值140
- 9.3使用结构数组和指针容易出现的错误145
- 9.4其他注意事项147
- 第10章联合与枚举148
- 10.1联合148
- 10.2枚举153
- 第11章状态机159
- 第二篇C语言编程中的好与坏
- 第12章注意编译系统的差别170
- 12.1打开所有编译开关170
- 12.2克服依靠编译系统产生的错误170
- 第13章测试与调试程序174
- 13.1预防措施174
- 13.1.1书写格式和注意事项174
- 13.1.2命名注意事项176
- 13.1.3程序注释178
- 13.2使用条件编译180
- 13.3消灭警告信息183
- 13.4使用简单的输出信息调试程序185
- 13.5编写error函数194
- 13.6使用集成环境提供的调试手段197
- 13.6.1一个简单的实例197
- 13.6.2编译程序198
- 13.6.3排错199
- 13.6.4基本调试命令简介200
- 13.6.5程序与汇编调试窗口203
- 13.7调试程序实例204
- 13.8软件测试206
- 13.8.1模块测试209
- 13.8.2组装测试211
- 13.8.3确认测试211
- 13.9程序的测试与调试212
- 13.10 测试用例设计技术214
- 13.10.1逻辑覆盖法215
- 13.10.2等价划分法218
- 13.10.3边值分析法219
- 13.10.4因果图法219
- 13.10.5错误猜测法220
- 第14章正确使用变量、常量和指针221
- 14.1基本数据类型的变量初始化221
- 14.2不要混淆字符和字符串222
- 14.3指针的初始化224
- 14.4指针相等228
- 14.5使用const232
- 14.5.1左值和右值232
- 14.5.2推荐使用const定义常量234
- 14.5.3对函数传递参数使用const限定符236
- 14.5.4对指针使用const限定符237
- 14.6使用volatile变量240
- 14.7变量的存储地址分配242
- 第15章正确使用宏246
- 15.1不要使用不存在的运算符246
- 15.2正确使用定义的宏247
- 15.3正确定义宏的参数248
- 15.4使用宏定义函数250
- 第16章控制语句252
- 16.1运算顺序错误252
- 16.2采用更明确的条件254
- 16.3设计存在的问题256
- 16.3.1没有涵盖全部条件256
- 16.3.2条件超出范围261
- 16.3.3减少循环次数264
- 16.4正确选择运算符273
- 16.5优先级和求值顺序错误277
- 第17章位运算285
- 17.1位运算典型错误285
- 17.2位运算典型实例290
- 第18章再论数组与指针295
- 18.1一维数值数组和指针295
- 18.1.1使用数组偏移量造成数组越界295
- 18.1.2使用数组名进行错误运算296
- 18.1.3错误使用数组下标和指向数组指针的下标298
- 18.1.4小结299
- 18.2一维字符数组和指针301
- 18.2.1字符数组的偏移量301
- 18.2.2字符数组不对称编程综合实例303
- 18.3动态内存307
- 18.3.1非数组的指针307
- 18.3.2NULL指针309
- 18.4二维数组和指针310
- 18.4.1二维数组的界限310
- 18.4.2二维数组的一维特性312
- 18.4.3指向二维数组的指针314
- 18.5数组和指针应用实例318
- 第19章再论函数325
- 19.1函数变量的作用域325
- 19.1.1块结构之间的变量屏蔽规则325
- 19.1.2程序和文件内的变量328
- 19.1.3多文件变量作用域331
- 19.2函数的参数337
- 19.2.1完璧归赵338
- 19.2.2多余的参数340
- 19.2.3传递的参数与函数参数
- 匹配问题342
- 19.2.4等效替换参数345
- 19.3函数的类型和返回值347
- 19.3.1函数的类型力求简单347
- 19.3.2实参要与函数形参的类型匹配349
- 19.3.3正确设计函数的返回方式351
- 19.3.4正确设计和使用函数指针356
- 19.3.5如何解读函数声明361
- 第20章再论库函数365
- 20.1getchar函数的返回类型不是字符365
- 20.2setbuf函数与其他函数的配合368
- 20.3错误使用errno函数377
- 20.4模拟设计printf函数379
- 20.4.1具有可变参数的函数379
- 20.4.2设计简单的打印函数382
- 20.4.3利用宏改进打印函数387
- 20.5scanf和sscanf函数392
- 20.5.1sscanf函数的使用方法394
- 20.5.2sscanf函数用法举例395
- 20.6探讨printf函数398
- 第21章再论结构400
- 21.1同类型结构变量之间的整体赋值400
- 21.2使用键盘赋值405
- 21.2.1为结构变量赋值405
- 21.2.2为结构指针变量赋值407
- 21.2.3为链表赋值411
- 21.2.4为结构数组的变量赋值412
- 21.2.5为含有指针域的结构数组赋值413
- 21.3使用结构作为函数的参数417
- 21.3.1结构变量的传数值与传地址值417
- 21.3.2结构数组传地址值418
- 21.4结构函数的返回值421
- 21.5修改传递的结构参数的值430
- 21.6优先使用结构指针传递参数435
- 第22章使用文件常见错误分析439
- 22.1文件的打开与关闭439
- 22.2文件的读写450
- 22.3其他读写函数464
- 22.4文件的定位467
- 22.5操作出错检测及错误标志的复位469
- 22.6文件的内存分配470
- 22.7小结470
- 第23章多文件编程472
- 23.1多文件编程错误浅析472
- 23.2单文件结构475
- 23.3一个源文件和一个头文件475
- 23.4多文件结构477
- 第24章发布C程序483
- 24.1两种版本的异同483
- 24.2两种版本的设置484
- 第25章典型问题486
- 25.1计算机解题具有多解的特点486
- 25.2应对算法进行优化487
- 25.3优化时要避免出现新的错误488
- 25.4扩展程序要注意是否满足全部条件494
- 25.5注意函数设计的多样化和效率496
- 25.6使用多文件编程502
- 25.7使用状态机设计程序507
- 附录AC语言操作符的优先级513
- 附录B简化优先级记忆口诀515
- 附录C7位ASCII代码表517
- 主要参考文献518