已阅读5页,还剩49页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
2019/5/29,高质量C语言编程指南,1,高质量C语言编程指南,路南平,2019/5/29,高质量C语言编程指南,2,目录,1.文件结构 2.程序的版式 3.命名规则 4.表达式和基本语句 5.函数设计 6.内存管理 7.其他编程经验,2019/5/29,高质量C语言编程指南,3,文件结构,C/C+程序中,文件有头文件、实现文件 资源文件等类型。常见的是以.h结尾的头文件 以.C或者.CPP结尾的实现文件.,2019/5/29,高质量C语言编程指南,4,版权和版本的声明,版权和版本的声明:位于头文件和实现文件的开头 ,主要说明了版权信息和版本信息,2019/5/29,高质量C语言编程指南,5,头文件结构,2019/5/29,高质量C语言编程指南,6,实现文件结构,2019/5/29,高质量C语言编程指南,7,目录结构,当软件的数目比较多时,通常将头文件和实现文件分别保存在不同的目录便于维护.,2019/5/29,高质量C语言编程指南,8,程序的版式,空行:每个函数定义结束之后都要加空行。,2019/5/29,高质量C语言编程指南,9,程序的版式,函数体内:逻辑上密切相关的语句之间不加空行,其他地方应加空行分割。,2019/5/29,高质量C语言编程指南,10,程序的版式,代码行:一行代码只做一件事。 if、for、while、do等语句自占一行,执行语句不得紧随其后。无论代码多少,都要加。,2019/5/29,高质量C语言编程指南,11,程序的版式,代码行内的空格: void Fun(int x,int y,int z); 不良风格代码 Void Fun(int x, int y, int z); if(year=200) 不良风格 If (year = 200) If (a=b,2019/5/29,高质量C语言编程指南,12,对齐,和要单独占一行,处同一列,内的代码应该之内右边数格对齐(tab键),2019/5/29,高质量C语言编程指南,13,长行拆分,屏幕显示有限,代码行最大字符在70到80之间。 长表达式要在低优先级操作符处拆分称新行,操作符放在新行之首。用#define的时候要加,2019/5/29,高质量C语言编程指南,14,修饰符位置,举例: Int* x,y; X变量是? Y变量是? 良好风格:int * x, y; 建议:应当将修饰符*紧靠变量名,2019/5/29,高质量C语言编程指南,15,注释,注释一般用于 版本、版权声明、函数接口说明、重要的代码行或段落提示。,2019/5/29,高质量C语言编程指南,16,2019/5/29,高质量C语言编程指南,17,2019/5/29,高质量C语言编程指南,18,命名规则,著名的匈牙利命名法: 基本原则是:变量名属性类型对象描述,其中每一对象的名称都要求有明确含义。 hwnd : h 是类型描述,表示句柄, wnd 是变量对象描述,表示窗口,所以 hwnd 表示窗口句柄; pfnEatApple : pfn 是类型描述,表示指向函数的指针, EatApple 是变量对象描述,所以它表示指向 EatApple 函数的函数指针变量。,2019/5/29,高质量C语言编程指南,19,命名共性规则,标识符应当直观且可以拼读,可望文知意。 标识符的长度应当符合“min-length & max_information”原则。 命名规则尽量与所采用的操作系统或者开发工具风格保持一致。(windos *nix linux) 程序中不要出现仅靠大小写区分的相似的标识符。 程序中不要出现标识符完全相同的局部变量和全局变量。,2019/5/29,高质量C语言编程指南,20,变量的名字应当使用“名词”或者“形容词+名词“ int value; float odlValue; float newValue; 全局函数的名字应当使用“动词“或者“动词+名词“。 DrawBox(); 用正确的反义词组命名具有互斥意义的变量或相反动作的函数等. int SetValue(); int GetValue(); 尽量避免名字中出现数字编号。,命名共性规则(续),2019/5/29,高质量C语言编程指南,21,简单windows程序命名规则,函数名用大写字母开头的单词组合而成。 void Draw(void); void SetValue(int value); 变量和参数用小写字母开头的单词组合而成。 BOOL flag ; int drawMode; 常量全用大写的字母,用下划线分割单词。 const int MAX = 100; const int MAX_LENGH = 100; 静态变量加前缀s_,全局变量加前缀g_; static int s_initValue; int g_howManyPeople; 可以为各种标识符加上能反映软件性质的前缀。 OpenGL的所有库函数以gl开头,常量以GL开头。,2019/5/29,高质量C语言编程指南,22,表达式和基本语句,2019/5/29,高质量C语言编程指南,23,表达式和基本语句,如果代码行中运算符比较多,用括号确定表达式的操作顺序。 if (a | b) 不要把程序中的复合表达式与真正的数学表达式混淆。 if (a b c),2019/5/29,高质量C语言编程指南,24,表达式和基本语句,If 语句: 布尔变量与0值比较 If (flag = 0) if (flag != 0) 不可将布尔变量直接与TRUE、FALSE或者1、0进行比较。 If (flag) if (!flag),2019/5/29,高质量C语言编程指南,25,If语句(续),整型变量与0值比较 if (value) if (!value) 应当将整型变量用“=”或“!=”直接与0比较。 If (value = 0) if (value != 0) 浮点型变量与0值比较 If (value = 0) if (value = 0.0) 不可将浮点变量用 “=”或者“!=”与任何数字比较。 If (value =-0.0001) & (value=0.0001),2019/5/29,高质量C语言编程指南,26,IF语句(续),指针变量与0值比较 if (p = 0) if (p) 应当将指针变量用“=”或“!=”与NULL比较 if (p = NULL) if (p != NULL) If (NULL = p) If/else/return 组合 if (condition) return x; return y; 良好风格:return (condition ? x : y);,2019/5/29,高质量C语言编程指南,27,循环效率,在多重循环中,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。,2019/5/29,高质量C语言编程指南,28,循环效率(续),如果循环体内存在逻辑判断,并且循环体次数很大,宜将逻辑判断移动到循环体的外面。,2019/5/29,高质量C语言编程指南,29,FOR语句的循环控制变量,不可在FOR循环体内修改循环变量,防止FOR循环失去控制。 for (i =0 ; i 10; i+) doSomeThing(); i+; 建议FOR语句的循环控制变量采用“半开半闭区间”写法。 For (x=0; x=9; x+),2019/5/29,高质量C语言编程指南,30,Switch语句,1.每个case语句的结尾不要忘记break; 2.最后添加一个default; 3.Case关键字之后的值 有什么要求么? case后面只能是整型或字符型的常量或常量表达式。 4.Case语句的顺序有什么要求? 把正常情况的语句放在前面,而把异常情况的语句放在后面。,2019/5/29,高质量C语言编程指南,31,GOTO 语句,goto语句也称为无条件转移语句,一般格式如下: goto 语句标号; 其中语句标号是按标识符规定书写的符号, 放在某一语句行的 前面,标号后加冒号(:)。 在跳出多重循环的时候,比较简洁。 慎用!,2019/5/29,高质量C语言编程指南,32,常量,常量的作用: 避免了意义模糊的数字出现,使得程序语义流畅清晰 可以很方便地进行参数的调整与修改 提高了程序的执行效率,由于使用了预编译器进行值替代,并不需要为这些常量分配存储空间,所以执行的效率较高。 用法: #define MAX 100,2019/5/29,高质量C语言编程指南,33,函数设计,参数的规则: 1.参数书写要完整。 void SetValue(int, int); void SetValue(int width, int height); 2.函数命名要恰当,顺序要合理。 void StringCopy(char *str1, char *str2); void StringCopy(char *strSource, char *strDestion);,2019/5/29,高质量C语言编程指南,34,参数规则,3.参数是指针,且仅做输入用,应在类型前加const防止修改。 void StringCopy(char *strDestion, const char *strSource); 4.避免函数有太多的参数。 5.尽量不要使用类型和数目不确定的参数。 int printf(const char *format, argument.);,2019/5/29,高质量C语言编程指南,35,返回值规则,1.不要省略返回值的类型。 2.函数名字与返回值类型在语义上可不冲突。,函数原型:Int getchar(void) 3.不要将正常值和错误标志混在一起返回。正常值用输出参数获得,错误表示用return语句返回。 4.有时候函数原本不需要返回值,为增加灵活性可以附加返回值。 char *strcpy(char *strDest, const char *strSrc); 可以支持链式表达 int length = strlen( strcpy(str, “Hwello World“);,2019/5/29,高质量C语言编程指南,36,函数内部实现规则,1.在函数体的入口处,对参数的有效性进行检查。 2.在函数体的出口处,对return语句的正确性和效率进行检查。 char * Func(void) char str = “hello world“; return str; return 语句不可返回指向栈内存的指针。,2019/5/29,高质量C语言编程指南,37,assert 断言,1.assert断言仅在Debug版本有效,如果“不可能发生“的事情的确发生了,则要使用断言进行报警。,2019/5/29,高质量C语言编程指南,38,内存管理,内存分配的方式: 1.从静态存储区域分配。全局变量static变量。 2.从栈上创建。系统自动管理. 3.从堆上分配,即动态内存分配。程序员管理. 常见错误. 1.内存分配未成功,却使用了它. 解决: 指针p是函数的参数,在入口处用assert(p!=NULL)检查。如果是malloc来申请内存,用if (p=NULL)或if (p!=NULL)进行放错处理。,2019/5/29,高质量C语言编程指南,39,常见错误,2.内存分配虽然成功,但是尚未初始化就引用它。 Int a100; For (i=0; i100; i+) if (ai = 0) 有的编译器初始化数组为0有的不是 最好在创建的时候赋值。,2019/5/29,高质量C语言编程指南,40,常见错误,3.内存分配成功并且已经初始化,但操作越过了内存的边界。 4.忘记释放内存,造成内存泄漏。 New /delete malloc /free 5.释放了内存却继续使用 (1).return 语句返回栈内存, (2).free或者delte释放了内存之后,没设置指针为NULL,导致“野指针“;,2019/5/29,高质量C语言编程指南,41,建议,1.malloc或new申请内存之后,立即检查指针值是否为NULL。 2.为数组和动态内存赋初值。 3.避免数组或者指针的下标越界。 4.动态内存的申请与释放必须配对。 5.fee或delete释放内存之后,立即将指针设置为NULL。,2019/5/29,高质量C语言编程指南,42,指针与数组的对比,1.数组被创建在静态存储区或者栈上,数组名对应着一块内存,其地址与容量在生命期内保持不变,数组的内容可以改变。 2.指针可以随时指向任意类型的内存块,其地址在生命期内保持不变,内容可变。,2019/5/29,高质量C语言编程指南,43,指针与数组的区别,修改内容:,2019/5/29,高质量C语言编程指南,44,指针与数组的区别,内容复制:,2019/5/29,高质量C语言编程指南,45,计算内存容量:,指针与数组的区别,2019/5/29,高质量C语言编程指南,46,指针参数如何传递内存,2019/5/29,高质量C语言编程指南,47,正确的传递程序(传地址),2019/5/29,高质量C语言编程指南,48,“野指针”,free只是把指针所指的内存给释放掉,但并没有把指针本身删除掉。指针指向的地址对应的内存是垃圾,指针成了“野指针“; 其他情况产生野指针: 1.指针变量在创建的时候没有被初始化。 2.指针操作超越了变量的作用范围。,2019/5/
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 吉林省吉林市船营区2023-2024学年八年级下学期期末考试物理试题含参考答案
- 公路橡胶施工方案
- 就诊患者管理制度范本
- 产品半年工作汇报
- 2025如何撰写工作总结
- 爱丁堡洋酒培训
- 高速公路管理匝道控制及事件管理
- 阿米巴经营培训后感
- 风电工程培训课件
- 超市防损科长述职报告
- 十巧手操(新版配乐)课件
- 钢结构焊接质量检验记录表
- 东北大学辅导员考试试题2023
- 小学英语词汇教学有效策略讲座
- 锁骨骨折课件
- 水生生物学课件 3.2 轮虫
- 结构加固改造之结构构件加固
- 气管导管气囊压力的监测
- YY/T 0031-2008输液、输血用硅橡胶管路及弹性件
- YC/T 280-2008烟草工业企业能源消耗
- GB/T 3836.1-2021爆炸性环境第1部分:设备通用要求
评论
0/150
提交评论