代码风格
学习了C语言的语句写法,紧跟着就要养成良好的编码习惯。良好的C代码书写习惯,需要具有一些典型的语句编码风格。下面介绍一下C语言语句的编码风格。
好的代码风格,让代码看着结构清晰,逻辑分明,并具有一种美感。每个公司都有自己的代码风格要求。但总体来说,C代码的风格需要注意如下几个地方:
1. 注释
注释有两种方式,它们分别是:
方式1:
/*
* this
is a comment
* the
following code will do something
* email:xxxx@126.com
*/
/* this
is a comment */
方式2:
// this
is a comment
注意/* */风格的注释不能嵌套使用。比如:
1./*
2. * xxxx
3. /*
4. *
yyy
5. */
6. * zzz
7.*/
在1到7行的注释中嵌套了3到5行的注释。那么注释将在第5行终止。第6,7行将失去注释作用。
2. 断行
为了便于阅读,一行代码不要太长。在Solaris内核代码中,要求一行不应超过80个字符。断行时应该选择将操作符留在最右边。新起一行应该在原来行缩进的基础上空4个字符。 例如:
if(pEnumProcesses == NULL ||
pGetModuleFileName == NULL ||
pEnumProcessModules == NULL)
{
return;
}
3. 每行只写一条语句
int a, b, t;
t = a; a = b; b = t;
应该写为:
int a;
int b;
int t;
t = a;
a = b;
b = t;
这样写很方便注释与调试。
4. 分行定义变量
参加条例3的定义
5. 使用空行分隔代码块
将完成同一逻辑的代码放在一个段中。适当地添加空行则是一个非常有效的代码整理方式——有点像文章中的分段,一段意思也许需要若干个句子才能表达清楚,在表达下一段意思之前,应当另起一段。
6. 使用空格降低代码密度
运算符与操作数之间以空格间隔;关键字与非关键字之间空格间隔。但单目运算符与它的操作数之间应紧密相接,不需要空格。括号(包括小括号、中括号与大括号)的内侧应该紧靠操作数或其他运算符,不需要添加额外的空格。不要在函数名和其后的括号之间添加空格。
需要空格的位置:
1) for、if、while、switch等关键字与之后的左括号’(‘之间,如:
while (b)
{
}
2) 左花括号’{‘之前,如:
if (b) {
}
3)双目运算符两侧,例如:
p == NULL;
a += b;
4)逗号’,’与分号’;’之后,如:
for (i = 0; i < 10; i++)
{
}
printf(“%d, %c\n”, a, ch);
不要空格的位置:
1) 函数名与之后的左括号’(‘,包括带参数的宏与之后的左括号’(‘,如:
max(a, b);
2)分号’;’与冒号’:’之前,如:
a = b;
switch (i)
{
case 1:
break;
defaut:
break;
}
3)左括号’(‘右边,右括号’)’左边,如:
if (p == NULL)。
4)单目运算符,如:
i++, !b等
1) 关键字与其他字符之间,如:
int length = sizeof (b);
其中的int和sizeof都是关键字。
2) 括号(大,中,小)内侧:
int a[500];
if (a >= b)
{
return (a);
}
7)’.’与’->’运算符不需要空格,如:
if (b->left)
{
}
list.val = 0;
需要空行的位置:
1)函数的定义之前、函数的定义之后;
2)一组联系紧密的代码段之前和之后。
/* other code above */
void swap(int a, int b)
{
int t;
t = a;
a = b;
b = t;
return;
}
/* other code below */
7. return
return (a);
return (NULL);
return (a + b);
return;
8. 缩进
是通过在每一行的代码左端空出一部分长度(一般为一个TAB键),更加清晰地从外观上体现出程序的层次结构。当遇到有关命名空间、类、结构、函数、以及枚举等等复杂程序结构的定义的时候,我们通常需要将它的内容缩进一层。
一般函数体、过程体、循环体(for,while,do)、条件判断体(if)和条件选择(switch,case,select)需要向内缩进一格,同层次的代码在同层次的缩进层上。
if (condition)
{
//缩进
printf(“hello world”);
}
else if (condition)
{
//缩进
}
else
{
//缩进
}
for (int i = 0; i < n; i++)
{
//缩进
}
while (condition)
{
//缩进
}
do
{
//缩进
} while(conditon)
switch(var)
{
case a:
//缩进
break;
case b:
//缩进
break;
default:
//缩进
break;
}
int function(int a, int b)
{
//缩进
}
class MyClass
{
//缩进
}
struct MyStruct
{
//缩进
};
9. 大括号
如果if、while、for等等的结构体仅为一条语句,那么大括号是可以不写的。其实复合体就是将多条语句合并起来充当单条语句来用的。甚至我们可以将结构体与if、while、for写成一行。当代码数量增加,上下文的代码变得复杂时,我们有可能会对if、while、for的结构体究竟包含哪些语句产生误解。因此,我们建议,即使if、while、for结构的内容只有一条语句,也应该像处理多条语句那样,写在大括号内。
下面是大括号与各种语句的布局写法例子:
if (condition) {
}
else if (condition) {
}
else {
}
for (int i = 0; i < n; i++) {
}
while (condition)
{
}
do
{
} while(conditon)
switch(var)
{
case a:
break;
case b:
break;
default:
break;
}
int function(int a, int b)
{
}
class MyClass
{
}
struct MyStruct
{
};
10. NULL,0,FALSE, 100等常量与变量的比较写法
把常量写在左边,可以提早发现错误,在编译阶段
指针:
if (NULL == p)
或
if (p == NULL)
整数:
if (i == 0)
或
if (0
== i)
布尔值:
if (b)
if(b==TRUE)
或
if (!b) if(b==FALSE)
实数:
不要将实数和零直接比较,如:
float f;
if (f == 0)
…
上面的写法是错误的。应该按照如下的方式进行:
#define DELTA 0.00001
if (f >= -DELTA && f <= DELTA)
int a = 10;
if (a==0)
{
}
else
{
}