高质量程序设计指南CC语言PPT精选文档

上传人:cn****1 文档编号:568214852 上传时间:2024-07-23 格式:PPT 页数:12 大小:322KB
返回 下载 相关 举报
高质量程序设计指南CC语言PPT精选文档_第1页
第1页 / 共12页
高质量程序设计指南CC语言PPT精选文档_第2页
第2页 / 共12页
高质量程序设计指南CC语言PPT精选文档_第3页
第3页 / 共12页
高质量程序设计指南CC语言PPT精选文档_第4页
第4页 / 共12页
高质量程序设计指南CC语言PPT精选文档_第5页
第5页 / 共12页
点击查看更多>>
资源描述

《高质量程序设计指南CC语言PPT精选文档》由会员分享,可在线阅读,更多相关《高质量程序设计指南CC语言PPT精选文档(12页珍藏版)》请在金锄头文库上搜索。

1、C+/C编程规范编程规范 帮助程序员一次性编写出高质量的程序帮助程序员一次性编写出高质量的程序 林林 锐锐 博士博士http:/ 上上 海海 漫漫 索索 计计 算算 机机 科科 技技 有有 限限 公公 司司Page 2目录目录0. 编程老手和高手的误区编程老手和高手的误区1. 程序的版式程序的版式 2. 命名规则命名规则3. 表达式和基本语句表达式和基本语句4. 函数设计函数设计5. 内存管理内存管理6. C+/C试题与答案,代码检查表试题与答案,代码检查表Page 30. 编程老手和高手的误区编程老手和高手的误区u自我臭美的程序员u程序员不同于武林人士,我们不要崇拜邪派高手 u大学计算机教育

2、的失误:从来就没有重视质量,绝大多数学士、硕士、博士不了解软件质量,不知道如何有效地提高软件的质量。 u高校毕业生C+/C编程考试的结果:程序质量低下u什么是编程老手:能够长期稳定地编写出高质量程序的程序员u什么是编程高手:能够长期稳定地编写出高难度、高质量程序的程序员Page 41. 程序的版式程序的版式1.1 文件结构文件结构 u版权和版本u头文件的作用 u头文件和定义文件的结构,正确使用include,ifndef/define/endif u目录结构1.2 版式版式u空行,代码行 u代码行内的空格u对齐 u修饰符 * & 的位置 u注释u类的版式:public, private 前后之

3、争Page 52. 命名规则命名规则 u不要追求世界上最好的命名规则!在机构内部一致即可。u匈牙利法的利弊u一些共性规则:直观并且可以拼读,可望文知意,不必“解码”。 名字的长度:min-length & max-information 原则 与操作系统和开发工具的风格保持一致 程序中不要出现仅靠大小写区分的相似的标识符 程序中不要出现标识符完全相同的局部变量和全局变量 变量的名字应当使用“名词”或者“形容词名词” 全局函数的名字应当使用“动词”或者“动词名词”(动宾词组)。类的成员函数应当只使用“动词”,被省略掉的名词就是对象本身。 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等

4、尽量避免名字中出现数字编号,如Value1,Value2等,除非逻辑上的确需要编号Page 63. 表达式和基本语句表达式和基本语句 3.1 表达式表达式u如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。 u不要编写太复杂的复合表达式。 不要把程序中的复合表达式与“真正的数学表达式”混淆。例如 if (a b c) 3.2 你会编写正确的你会编写正确的 if 语句吗语句吗u布尔变量与零值比较u整型变量与零值比较u浮点变量与零值比较u指针变量与零值比较u为什么有人用 If(NULL = P) 这样“古怪”的格式3.3 循环语句循环语句u在多重循环中,如果有可能,应当

5、将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。 u如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。 u建议for语句的循环控制变量的取值采用“半开半闭区间”写法。 3.4 switch, goto Page 74. 函数设计函数设计4.1 参数的规则参数的规则u参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字。 u参数命名要恰当,顺序要合理。 示例 StringCopy(char *str1,char *str2)u如果参数是指针,且仅做输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。 u避免函数有太多的参数

6、,参数个数尽量控制在5个以内。如果参数太多,在使用时容易将参数类型或顺序搞错。 u尽量不要使用类型和数目不确定的参数。例如 printf4.2 返回值的规则返回值的规则u不要省略返回值的类型。u函数名字与返回值类型在语义上不可冲突。例如 getcharu不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用return语句返回。 u有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值。例如 char *strcpy(char *strDest,const char *strSrc);4.3 函数内部实现的规则:函数内部实现的规则:在函数体的在函数体的“入口

7、处入口处”和和“出口处出口处”从严把关从严把关 u在函数体的“入口处”,对参数的有效性进行检查。 u在函数体的“出口处”,对return语句的正确性和效率进行检查。 Page 84. 函数设计函数设计4.4 一些建议一些建议u函数的功能要单一,不要设计多用途的函数。 u函数体的规模要小,尽量控制在50行代码之内。 u尽量避免函数带有“记忆”功能。相同的输入应当产生相同的输出。带有“记忆”功能的函数,其行为可能是不可预测的,因为它的行为可能取决于某种“记忆状态”。 u不仅要检查输入参数的有效性,还要检查通过其他途径进入函数体内的变量的有效性,例如全局变量、文件句柄等。 u用于出错处理的返回值一定

8、要清楚,让使用者不容易忽视或误解错误情况。 4.5 使用断言使用断言u使用断言捕捉不应该发生的非法情况。不要混淆非法情况与错误情况之间的区别,后者是必然存在的并且是一定要做出处理的。 u在函数的入口处,使用断言检查参数的有效性(合法性)。 u在编写函数时,要进行反复的考查,并且自问:“我打算做哪些假定?”一旦确定了的假定,就要使用断言对假定进行检查。 Page 95. 内存管理内存管理5.1 内存分配方式内存分配方式u从静态存储区域分配。内存在程序编译的时候就已经分配好,这块内存在程序的整个运行期间都存在。例如全局变量,static变量。 u在栈上创建。在执行函数时,函数内局部变量的存储单元都

9、可以在栈上创建,函数执行结束时这些存储单元自动被释放。栈内存分配运算内置于处理器的指令集中,效率很高,但是分配的内存容量有限。 u从堆上分配,亦称动态内存分配。程序在运行的时候用malloc或new申请任意多少的内存,程序员自己负责在何时用free或delete释放内存。动态内存的生存期由我们决定,使用非常灵活,但问题也最多。 5.2 常见的内存错误常见的内存错误u内存分配未成功,却使用了它。 u内存分配虽然成功,但是尚未初始化就引用它。 u内存分配成功并且已经初始化,但操作越过了内存的边界。 u忘记了释放内存,造成内存泄漏。 u释放了内存却继续使用它 Page 105. 内存管理内存管理5.

10、3 对策对策u用malloc或new申请内存之后,应该立即检查指针值是否为NULL。防止使用指针值为NULL的内存。 u不要忘记为数组和动态内存赋初值。防止将未被初始化的内存作为右值使用。u避免数组或指针的下标越界,特别要当心发生“多1”或者“少1”操作。 u动态内存的申请与释放必须配对,防止内存泄漏。 u用free或delete释放了内存之后,立即将指针设置为NULL,防止产生“野指针”。 5.4 free 和和 delete 把指针怎么啦?把指针怎么啦?u它们只是把指针所指的内存给释放掉,但并没有把指针本身干掉。 u指针p被free以后其地址仍然不变(非NULL),只是该地址对应的内存是垃

11、圾,p成了“野指针”。如果此时不把p设置为NULL,会让人误以为p是个合法的指针。 u如果程序比较长,我们有时记不住p所指的内存是否已经被释放,在继续使用p之前,通常会用语句if (p != NULL)进行防错处理。很遗憾,此时if语句起不到防错作用,因为即便p不是NULL指针,它也不指向合法的内存块。 “野指针”示例5.5 动态内存会被自动释放吗?示例动态内存会被自动释放吗?示例u指针消亡了,并不表示它所指的内存会被自动释放。 u内存被释放了,并不表示指针会消亡或者成了NULL指针。 Page 115. 内存管理内存管理5.6 杜绝野指针杜绝野指针u“野指针”不是NULL指针,是指向“垃圾”

12、内存的指针。人们一般不会错用NULL指针,因为用if语句很容易判断。但是“野指针”是很危险的,if语句对它不起作用。 u“野指针”的成因主要有三种: 指针变量没有被初始化。任何指针变量刚被创建时不会自动成为NULL指针,它的默认值是随机的,它会乱指一气。 指针p被free或者delete之后,没有置为NULL,让人误以为p是个合法的指针。 指针操作超越了变量的作用范围。这种情况让人防不胜防 5.7 有了有了malloc/free 为什么还要为什么还要new/deleteuMalloc/free 是库函数,new/delete是运算符。 u光用maloc/free无法满足动态对象的要求。对象在创

13、建的同时要自动执行构造函数,对象在消亡之前要自动执行析构函数。由于malloc/free是库函数而不是运算符,不在编译器控制权限之内,不能够把执行构造函数和析构函数的任务强加于malloc/free。因此C+语言需要一个能完成动态内存分配和初始化工作的运算符new,以及一个能完成清理与释放内存工作的运算符delete。 5.8 内存耗尽怎么办?内存耗尽怎么办?5.9 建议:建议:必须养成必须养成“使用调试器逐步跟踪程序使用调试器逐步跟踪程序”的习惯,只有这样才能发现问的习惯,只有这样才能发现问题的本质。题的本质。 Page 126. C+/C试题与答案,试题与答案,代码检查表代码检查表详见高质量程序设计指南详见高质量程序设计指南C+/C语言语言(第二版)(第二版)的附录,电子工业出版的附录,电子工业出版社,社,2003年年6月月

展开阅读全文
相关资源
正为您匹配相似的精品文档
相关搜索

最新文档


当前位置:首页 > 医学/心理学 > 基础医学

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号