C语言格式书写规范.docx
- 文档编号:2224962
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:21
- 大小:28.79KB
C语言格式书写规范.docx
《C语言格式书写规范.docx》由会员分享,可在线阅读,更多相关《C语言格式书写规范.docx(21页珍藏版)》请在冰豆网上搜索。
C语言格式书写规范
C语言书写规范指南
第1章文件结构
每个C程序通常分为两个文件。
一个文件用于保存程序的声明(declaration),称为头文件。
另一个文件用于保存程序的实现(implementation),称为定义(definition)文件。
C程序的头文件以“.h”为后缀,C程序的定义文件以“.c”为后缀。
版权和版本的声明
版权和版本的声明位于头文件和定义文件的开头(参见示例1-1),主要内容有:
(1)版权信息。
(2)文件名称,标识符,摘要。
(3)当前版本号,作者/修改者,完成日期。
(4)版本历史信息。
/*
*Copyright(c)2001,吉林大学物理学院无线电
*Allrightsreserved.
*
*文件名称:
*文件标识:
*摘要:
简要描述本文件的内容
*
*当前版本:
*作者:
输入作者(或修改者)名字
*完成日期:
2007年7月20日
*
*取代版本:
*原作者:
输入原作者(或修改者)名字
*完成日期:
2007年5月10日
*/
示例1-1版权和版本的声明
头文件的结构
头文件由三部分内容组成:
(1)头文件开头处的版权和版本声明(参见示例1-1)。
(2)预处理块。
(3)函数和类结构声明等。
假设头文件名称为,头文件的结构参见示例1-2。
【规则1-2-1】为了防止头文件被重复引用,应当用#ifndef/#define/#endif结构产生预处理块。
【规则1-2-2】用#include<>格式来引用标准库的头文件(编译器将从标准库目录开始搜索)。
【规则1-2-3】用#include“”格式来引用非标准库的头文件(编译器将从用户的工作目录开始搜索)。
【规则1-2-4】#include后面使用TAB键控制排版。
【规则1-2-5】头文件中只存放“声明”而不存放“定义”
【规则1-2-6】全局变量在头文件中声明,在.c文件中定义
.hexternintvalue;声明。
.cintvalue=0x10;定义。
【规则1-2-7】局部变量在.c中定义(static)unsignedintvalue;定义。
、“->”这类操作符前后不加空格。
【建议2-3-1】对于表达式比较长的for语句和if语句,为了紧凑起见可以适当地去掉一些空格,如for(i=0;i<10;i++)和if((a<=b)&&(c<=d))
voidFunc1(intx,inty,intz);
从左至右
!
~++--(类型)sizeof
+-*&
从右至左
*/%
从左至右
+-
从左至右
<<>>
从左至右
<<=>>=
从左至右
==!
=
从左至右
&
从左至右
^
从左至右
|
从左至右
&&
从左至右
||
从右至左
:
从右至左
=+=-=*=/=%=&=^=
|=<<=>>=
从左至右
表4-1运算符的优先级与结合律
【规则4-1-1】如果代码行中的运算符比较多,用括号确定表达式的操作顺序,避免使用默认的优先级。
由于将表4-1熟记是比较困难的,为了防止产生歧义并提高可读性,应当用括号确定表达式的操作顺序。
例如:
word=(high<<8)|low
if((a|b)&&(a&c))
复合表达式
如a=b=c=0这样的表达式称为复合表达式。
允许复合表达式存在的理由是:
(1)书写简洁;
(2)可以提高编译效率。
但要防止滥用复合表达式。
【规则4-2-1】不要编写太复杂的复合表达式。
例如:
i=a>=b&&c 【规则4-2-2】不要有多用途的复合表达式。 例如: d=(a=b+c)+r; 该表达式既求a值又求d值。 应该拆分为两个独立的语句: a=b+c; d=a+r; 【规则4-2-3】不要把程序中的复合表达式与“真正的数学表达式”混淆。 例如: if(a if((a 而是成了令人费解的 if((a 语句 if语句是C语言中最简单、最常用的语句,然而很多程序员用隐含错误的方式 写if语句。 本节以“与零值比较”为例,展开讨论。 布尔变量与零值比较 【规则4-3-1】不可将布尔变量直接与TRUE、FALSE或者1、0进行比较。 根据布尔类型的语义,零值为“假”(记为FALSE),任何非零值都是“真”(记为 TRUE)。 TRUE的值究竟是什么并没有统一的标准。 例如VisualC++将TRUE定义为1, 而VisualBasic则将TRUE定义为-1。 假设布尔变量名字为flag,它与零值比较的标准if语句如下: if(flag)//表示flag为真 if(! flag)//表示flag为假 其它的用法都属于不良风格,例如: if(flag==TRUE) if(flag==1) if(flag==FALSE) if(flag==0) 整型变量与零值比较 【规则4-3-2】应当将整型变量用“==”或“! =”直接与0比较。 假设整型变量的名字为value,它与零值比较的标准if语句如下: if(value==0) if(value! =0) 不可模仿布尔变量的风格而写成 if(value)//会让人误解value是布尔变量 if(! value) 浮点变量与零值比较 【规则4-3-3】不可将浮点变量用“==”或“! =”与任何数字比较。 千万要留意,无论是float还是double类型的变量,都有精度限制。 所以一定要避免将浮点变量用“==”或“! =”与数字比较,应该设法转化成“>=”或“<=”形式。 假设浮点变量的名字为x,应当将 if(x==//隐含错误的比较转化为 if((x>=-EPSINON)&&(x<=EPSINON)) 其中EPSINON是允许的误差(即精度)。 指针变量与零值比较 【规则4-3-4】应当将指针变量用“==”或“! =”与NULL比较。 指针变量的零值是“空”(记为NULL)。 尽管NULL的值与0相同,但是两者意义不同。 假设指针变量的名字为p,它与零值比较的标准if语句如下: if(p==NULL)//p与NULL显式比较,强调p是指针变量 if(p! =NULL) 不要写成 if(p==0)//容易让人误解p是整型变量 if(p! =0) 或者 if(p)//容易让人误解p是布尔变量 if(! p) 对if语句的补充说明 有时候我们可能会看到if(NULL==p)这样古怪的格式。 不是程序写错了,是程序 员为了防止将if(p==NULL)误写成if(p=NULL),而有意把p和NULL颠倒。 编译器认为if(p=NULL)是合法的,但是会指出if(NULL=p)是错误的,因为NULL不能被赋值。 程序中有时会遇到if/else/return的组合,应该将如下不良风格的程序 if(condition) returnx; returny; 改写为 if(condition) { returnx; } else { returny; } 或者改写成更加简练的 return(conditionx: y); 循环语句的效率 C循环语句中,for语句使用频率最高,while语句其次,do语句很少用。 本节重点论述循环体的效率。 提高循环体效率的基本办法是降低循环体的复杂性。 【建议4-4-1】在多重循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,以减少CPU跨切循环层的次数。 例如示例4-4(b)的效率比示例4-4(a)的高。 for(row=0;row<100;row++) { for(col=0;col<5;col++) { fum=sum+a[row][col]; } } 示例4-4(a)低效率: 长循环在最外层 for(col=0;col<5;col++) { for(row=0;row<100;row++) { fum=sum+a[row][col]; } } 示例4-4(b)高效率: 长循环在最内层 【建议4-4-2】如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体的外面。 示例4-4(c)的程序比示例4-4(d)多执行了N-1次逻辑判断。 并且由于前者老要进行逻辑判断,打断了循环“流水线”作业,使得编译器不能对循环进行优化处理,降低了效率。 如果N非常大,最好采用示例4-4(d)的写法,可以提高效率。 如果N非常小,两者效率差别并不明显,采用示例4-4(c)的写法比较好,因为程序更加简洁。 for(i=0;i { if(condition { DoSomething(); } else { DoOtherthing(); } } 表4-4(c)效率低但程序简洁 if(condition) { for(i=0;i } else { for(i=0;i } 表4-4(d)效率高但程序不简洁 语句的循环控制变量 【规则4-5-1】不可在for循环体内修改循环变量,防止for循环失去控制。 【建议4-5-1】建议for语句的循环控制变量的取值采用“半开半闭区间”写法。 示例4-5(a)中的x值属于半开半闭区间“0= 示例4-5(b)中的x值属于闭区间“0= 相比之下,示例4-5(a)的写法更加直观,尽管两者的功能是相同的。 for(intx=0;x { … } 示例4-5(a)循环变量属于半开半闭区间 for(intx=0;x<=N-1;x++) { … } 示例4-5(b)循环变量属于闭区间 语句 switch是多分支选择语句,而if语句只有两个分支可供选择。 虽然可以用嵌套的if语句来实现多分支选择,但那样的程序冗长难读。 这是switch语句存在的理由。 switch语句的基本格式是: switch(variable) { casevalue1: { … break; } casevalue2: { … break; } … default: { … break; } } 【规则4-6-1】每个case语句的结尾不要忘了加break,否则将导致多个分支重叠(除 非有意使多个分支重叠)。 【规则4-6-2】不要忘记最后那个default分支。 即使程序真的不需要default处理,也应该保留语句default: break;这样做并非多此一举,而是为了防止别人误以为你忘了default处理。 语句 自从提倡结构化设计以来,goto就成了有争议的语句。 首先,由于goto语句可以灵活跳转,如果不加限制,它的确会破坏结构化设计风格。 其次,goto语句经常带来错误或隐患。 它可能跳过了某些对象的构造、变量的初始化、重要的计算等语句,例如: gotostate; Strings1,s2;//被goto跳过 intsum=0;//被goto跳过 … state: … 如果编译器不能发觉此类错误,每用一次goto语句都可能留下隐患。 很多人建议废除C的goto语句
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 语言 格式 书写 规范
![提示](https://static.bdocx.com/images/bang_tan.gif)