(初级程序员 讨论版)
前言
一个好的程序编写规范是编写高质量程序的保证。清晰、规范的源程序不仅仅是方便阅读,更重要的是能够便于检查错误,提高调试效率,从而最终保证软件的质量和可维护性。
说明
l 本文档主要适用于刚刚开始接触编程的初学者。
l 对于具有一定工程项目开发经验的程序员,建议学习C语言程序代码编写规范—高级版。
目录
1 代码书写规范
2 注释书写规范
3 命名规范
4 其它一些小技巧和要求
1 代码书写规范
1.1函数定义
花括号: { }
每个函数的定义和说明应该从第1列开始书写。函数名(包括参数表)和函数体的花括号应该各占一行。在函数体结尾的括号后面可以加上注释,注释中应该包括函数名,这样比较方便进行括号配对检查,也可以清晰地看出来函数是否结束。
范例1:函数的声明
void matMyFunction(int n)
{
……
} /* matMyFunction*/
1.2空格与空行的使用
要加空格的场合
l 在逗号后面和语句中间的分号后面加空格,如:
int i, j, k
for (i = 0i <ni++)
result = func(a, b, c)
l 在二目运算符的两边各留一个空格,如
a >ba <= b i = 0
l 关键字两侧,如if () …, 不要写成if() …
l 类型与指针说明符之间一定要加空格:
char *szName
不加空格的场合
l 在结构成员引用符号.和->左右两加不加空格:
pStud->szName, Student.nID
l 不在行尾添加空格或Tab
l 函数名与左括号之间不加空格:
func(…)
l 指针说明符号*与变量名间不要加空格:
int *pInt不要写成: int * pInt
l 复合运算符中间不能加空格,否则会产生语法错误,如:
a + = b a <= b都是错误的
空行与换行
l 函数的变量说明与执行语句之间加上空行
l 每个函数内的主要功能块之间加空行表示区隔
l 不要在一行中写多条语句.
范例2:空行与换行
int main()
{
int i, j, nSum = 0 //变量说明
for (i = 0i <10i++) //执行代码
{
for (j = 0j <10j++)
{
nSum += i
}
}
}
1.3缩进的设置
根据语句间的层次关系采用缩进格式书写程序,每进一层,往后缩进一层
有两种缩进方式:1,使用Tab键;2,采用4个空格。
整个文件内部应该统一,不要混用Tab键和4个空格,因为不同的编辑器对Tab键的处理方法不同。
1.4折行的使用
· 每行的长度不要超过80个字符,当程序行太长时,应该分行书写。
· 当需要把一个程序行的内容分成几行写时, *** 作符号应该放在行末。
· 分行时应该按照自然的逻辑关系进行,例如:不要把一个简单的逻辑判断写在两行上。
· 分行后的缩进应该按照程序的逻辑关系进行对齐。例如:参数表折行后,下面的行应该在参数表左括号的下方。
范例2:折行的格式
dwNewShape = matAffineTransform(coords, translation,
rotation)
if (((new_shape.x >left_border) &&
(new_shape.x <right_border)) &&
((new_shape.y >bottom_border) &&
(new_shape.y <top_border)))
{
draw(new_shape)
}
1.5嵌套语句(语句块)的格式
对于嵌套式的语句--即语句块(如,if、while、for、switch等)应该包括在花括号中。花括号的左括号应该单独占一行,并与关键字对齐。建议即使语句块中只有一条语句,也应该使用花括号包括,这样可以使程序结构更清晰,也可以避免出错。建议对比较长的块,在末尾的花括号后加上注释以表明该语言块结束。
范例3:嵌套语句格式
if (value <max)
{
if (value != 0)
{
func(value)
}
}
} else {
error("The value is too big.")
} /* if (value <max) */
2 注释书写规范
注释必须做到清晰,准确地描述内容。对于程序中复杂的部分必须有注释加以说明。注释量要适中,过多或过少都易导致阅读困难。
2.1注释风格
· C语言中使用一组(/* … */)作为注释界定符。
· 注释内容尽量用英语方式表述。
· 注释的基本样式参考范例4。
· 注释应该出现在要说明的内容之前,而不应该出现在其后。
· 除了说明变量的用途和语言块末尾使用的注释,尽量不使用行末的注释方式。
范例4:几种注释样式
/*
* ************************************************
* 强调注释
* ************************************************
*/
/*
* 块注释
*/
/* 单行注释 */
//单行注释
int i/*行末注释*/
2.2何时需要注释
· 如果变量的名字不能完全说明其用途,应该使用注释加以说明。
· 如果为了提高性能而使某些代码变得难懂,应该使用注释加以说明。
· 对于一个比较长的程序段落,应该加注释予以说明。如果设计文档中有流程图,则程序中对应的位置应该加注释予以说明。
· 如果程序中使用了某个复杂的算法,建议注明其出处。
· 如果在调试中发现某段落容易出现错误,应该注明。
3 命名规范
3.1常量、变量命名
l 符号常量的命名用大写字母表示。如:
#define LENGTH 10
l 如果符号常量由多个单词构成,两个不同的单词之间可以用下划线连接。如:
#define MAX_LEN 50
变量命名的基本原则:
l 可以选择有意义的英文(小写字母)组成变量名,使人看到该变量就能大致清楚其含义。
l 不要使用人名、地名和汉语拼音。
l 如果使用缩写,应该使用那些约定俗成的,而不是自己编造的。
l 多个单词组成的变量名,除第一个单词外的其他单词首字母应该大写。如:
dwUserInputValue。
3.2函数命名
函数命名原则与变量命名原则基本相同。对于初学者,函数命名可以采用“FunctionName”的形式。
4 其它一些小技巧和要求
l 函数一般情况下应该少于100行
l 函数定义一定要包含返回类型,没有返回类型加void
l 写比较表达式时,将常量放在左边
10 == n
NULL != pInt
l 指针变量总是要初始或重置为NULL
l 使用{}包含复合语句,即使是只有一行,如:
if (1 == a)
{
x = 5
}
http://home.ustc.edu.cn/~danewang/c/CodingStandards.html
1.1.1符号命名规则
1.1.1符号名包括模块名、常量名、标号名、子程序名等。这些名字应该能反映它所代表的实际东西,具有一定的意义,使其能够见名知义,有助于对程序功能的理解。命名采用匈牙利命名法。规则如下:
(1)所有宏定义、枚举常数和const变量,用大写字母命名。在复合词里用下划线隔开每个词。
(2)复合词中每个单词的第一个字母大写。除了规则5.1.1.1以外,避免使用下划线。
(3)类、类型定义和枚举型名的第一个字母大写。
(4)函数名是复合词的,第一个词采用全部小写,随后每个单词采用第一个字母大写,其它字母小写方式;如果是单个词的,采用全部小写方式。
(5)循环变量可采用i, j, k等,不受上述规则限制。
(6) 类的成员变量应采用m_开头。
(7) 全局变量词头为g_ 。
(8) 临时变量词头为tmp_ 。
(9) 对结构体内的变量命名, 遵循变量的具体含义命名原则
(10)用小写字母的前缀表示变量的类型,前缀的下一个字母用大写。
表 1
词头 类型 词头类型
ch charl long
i integer u unsigned
b boolean p pointer
f float lplong pointer
d double s string
st structure szASCII string
by byten short int
H handle x,y分别为x,y坐标
dw DWORD fnfunction
表 2
词头 变量名 词头 变量名
task tasksig signal
sbbinary semaphores wd watchdog
smmutual exclusion tm timer
sccounting semaphores msg message
pipe pipe
例:
#define ARRAY_SIZE 24 /*规则5.1.1.1*/
int g_iFlag
class MyClass /*规则5.1.1.3*/
{
}
void someFunc( ) /*规则5.1.1.2和5.1.1.4*/
{
int nArray[ARRAY_SIZE]
unsigned char uchByte
char szName[ ]
char *pszName = szName
}
(11)有些词头(如p和u)可以和其它词头组合。
例:WDOG_ID wdId
WDOG_ID g_wdId /*全局watchdog Id,故以g_开头*/
1.1.2名字的长度一般不要过长或过短。过长的名字会增加工作量,使程序逻辑流程变得模糊;过短的名字无法表达符号的实际意义。约定长度范围:3-31;
1.2数据和函数说明
1.2.1数据说明次序应当规范化,使数据属性容易查找,也有利于测试、排错和维护。说明的先后次序应固定,应按逻辑功能排序,逻辑功能块内建议采用下列顺序:整型说明、实型说明、字符说明、逻辑量说明。
1.2.2如果设计了一个复杂的数据结构,应当通过注释对其变量的含义、用途进行说明。
1.2.3在函数的声明中使用异常声明。
如:void f() throw(toobig, toosmall, divzero)
在声明一个函数时,将它所抛出的异常列出,便于函数的使用者了解可能会发生哪些异常。
1.3 程序注释
1.3.1程序注释是程序员与日后的程序读者之间通信的重要手段之一,注释分为文件注释、函数注释和功能注释。
1.3.2正规程序的注释应注意:
——注释行的数量占到整个源程序的1/3到1/2。
1.3.3文件注释位于整个源程序的最开始部分,注释后空两行开始程序正文。它包括:
——程序标题。
——目的、功能说明。
——文件作者、最后修改日期等说明。
例:
./********************************************************************
(空一行)
标题: Demo.c
功能: 测试VxWorks的各种系统调用.
说明:
该程序测试各种VxWorks的系统调用函数。包括任务(taks)的创建、挂起及任务间通过信号灯实现同步,通过消息队列 进行通讯。
程序创建了两个任务:一个高优先级的任务和一个低优先级的任务。两个任务间通过一个二进制的信号灯进行同步,通过消息队列进行通讯。
当前版本: x.x
修改信息: 2000.06.05 John, Initial Version
2000.07.05 Tom, Bug xxxx fixed
**************************************************************/
(空2行,开始程序正文)
1.3.4 函数注释通常置于每函数或过程的开头部分,它应当给出函数或过程的整体说明对于理解程序本身具有引导作用。一般包括如下条目:
——模块标题。
——有关本模块功能和目的的说明。
——调用格式
——接口说明:包括输入、输出、返回值、异常。
——算法。如果模块中采用了一些复杂的算法。
例:
file://(/注释开头应和上一函数空两行)
(注释开头与上一函数最后一行间隔两行)
/********************************************************************
标题:assignmentComplete
功能:BSC=>MSC消息生成函数,生成assignment_complete指配完成消息(BSMAP消息) .
格式:
int assignmentComplete(int iCellId, int iServiceChannnelNum, char *pszMSGData) throw(exception1, exception2)
输入:
int iCellId: MS所在的小区识别
iCellId取值:0x00-——0xff
int iServiceChannnelNum:MS所占的业务信道号码
输出:
char * pszMSGData:指配完成消息数据
返回值: 0x00正常
异常:exception1异常情况1, exception2异常情况2
********************************************************************/
( 注释后直接开始程序正文,不空行。)
1.3.5功能性注释嵌在源程序体中,用于描述其后的语句或程序段做什么工作,也就是解释下面要做什么,或是执行了下面的语句会怎么样。而不要解释下面怎么做,因为解释怎么做常常与程序本身是重复的。
例:
/*把 amount 加到 total中*/
total = amount + total
这样的注释仅仅是重复了下面的程序,对于理解它的工作并没有什么作用。而下面的注释,有助于读者理解。
/*将每月的销售额amount加到年销售额total中*/
total = amount + total
1.4 函数编写应尽可能短小精悍,一般不超过两屏,以便于调试和理解。
1.5语句结构
为保证语句结构的清晰和程序的可读性,在编写软件程序时应注意以下几个方面的问题:
——在一行内只写一条语句,并采用空格、空行和移行保证清楚的视觉效果。
——每一个嵌套的函数块,使用一个TAB缩进(可以设定为4个空格),大括号必须放在条件语句的下一行,单独成一行,便于匹对:
如,有一段程序如下:
for(i=1i<n-1i++){ t=1for(j=i+1j<nj++){
if(a[j]<a[t] ) t=jif(t!=i ){work=a[t]a[t]=a[I]a[I]=work}}}
应写为
for( i=1i<n-1i++)
{
t=1
for(j = i+1j<nj++)
{
if(a[i]<a[j])
t=j
if(t!=1)
{ .5.
Q/ECC/BJ 010—2001
work=a[t]
a[t]=a[i]
a[i]=work
}
}
}
——文件之中不得存在无规则的空行,比如说连续十个空行。
一般来讲函数与函数之间的空行为2-3行;
在函数体内部,在逻辑上独立的两个函数块可适当空行,一般为1-2行。
——程序编写首先应考虑清晰性,不要刻意追求技巧性而使得程序难以理解。
——每行长度尽量避免超过屏幕宽度,应不超过80个字符。
——除非对效率有特殊要求,编写程序要作到清晰第一,效率第二。
——尽可能使用函数库。
——尽量用公共过程或子程序去代替重复的功能代码段。要注意,这个代码应具有一个独立的功能,不要只因代码形式一样便将其抽出组成一个公共过程或子程序。
——使用括号清晰地表达算术表达式和逻辑表达式的运算顺序。如将 x=a*b/c*d 写成 x=(a*b/c)*d可避免阅读者误解为x=(a*b)/(c*d)。
——避免不必要的转移。
——避免采用过于复杂的条件测试。
——避免过多的循环嵌套和条件嵌套。
——建议不要使用 *=,^=, /=等运算符。
——一个函数不要超过200行。一个文件应避免超过2000行。
——尽量避免使用go to语句。
——避免采用多赋值语句,如x = y = z
——不鼓励采用?: *** 作符,如z = (a>b)?a:b
——不要使用空的if else 语句。如
if(cMychar >= ‘A’)
if(cMychar <= ‘Z’)
printf(“This is a letter \n”)
else
printf(“This is not a letter \n”)
else到底是否定哪个if容易引起误解。可通过加{}避免误解。
——尽量减少使用“否定”条件的条件语句。如:
把 if( !( (cMychar<’0’) || (cMychar>’9’) ) )
改为if( (cMychar>=’0’) &&(cMychar<=’9’) )
C语言的书写格式有以下几个特点:1. 大小写敏感:C语言中的关键字、标识符等都是区分大小写的,建议统一使用小写字母。
2. 分号结尾:C语言中的语句必须以分号结尾,否则会导致编译错误。
3. 缩进:为了方便阅读和代码的可读性,建议使用缩进,将代码按照逻辑分块。缩进一般使用4个空格或一个制表符(Tab)。
4. 注释:注释可以提高代码的可读性,建议在代码中适当加入注释。单行注释使用`//`,多行注释使用`/* ... */`。
以下是一些书写C语言代码的建议:
1. 使用有意义的变量名,避免使用单个字母作为变量名。
2. 每行代码尽量控制在80个字符以内,过长的代码可以在适当的位置进行换行。
3. 在代码中使用空格分隔符,使代码更易读。
4. 使用大括号将代码块括起来,即使代码块只有一行,这样可以增加代码的可读性。
5. 如果需要多个语句组成一个代码块,可以将它们放在一对大括号中,这样可以增加代码的可读性。
6. 在代码中使用空行分隔代码块,这样可以增加代码的可读性。
以下是一个示例代码,展示了如何书写便于阅读的C语言代码:
```c
#include <stdio.h>
int main() {
int a = 1
int b = 2
int c = a + b// 计算a和b的和
if (c >3) {
printf("c的值大于3\n")// 输出结果
} else {
printf("c的值小于等于3\n")// 输出结果
}
return 0
}
```
在这个示例代码中,我们使用了缩进、注释、空格、空行、大括号等方式,使代码更加易读。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)