1.4 C语言代码风格

开发软件不是一朝一夕的事情,更多的情况下,一个软件的开发周期需要很长时间,并且通常由多人合作完成。因此,一定要保持良好的编码风格,才能最大限度地提高程序开发效率。很多人不重视这点,甚至国内的绝大多数教材也不讨论这个话题,导致学生进入公司后仍要进行编码风格的教育,所以从一开始接触代码就要努力养成良好的编码习惯。

1.4.1 程序格式

程序的格式不影响代码的执行,但影响其可读性和维护性。程序的格式应追求清楚美观、简洁明了,让人一目了然。

1.代码行

其规则概括为:一行只写一条语句,这样方便测试;一行只写一个变量,这样方便写注释。例如下面的代码:

int num;

int age;

需要注意的是,if、for、while、do等语句各占一行,其执行语句无论有几条都用符号“{”和“}”将其包含在内。例如下面的代码:

2.对齐与缩进

对齐与缩进可以保证代码的整洁、层次清晰,其主要表现在以下几点:

●一般用设置为4个空格的Tab键缩进,不用空格缩进。

●符号“{”和与其对应的“}”要独占一行,且位于同一列,与引用它们的语句左对齐。

●位于同一层符号“{”和“}”之内的代码,要在“{”的下一行缩进,即同层次的代码在同层次的缩进层上。

下面将列举一些风格正确的代码。

(1)函数定义语句的代码风格:

(2)if……else语句的代码风格:

if(condition)

{

(3)for语句的代码风格:

(4)while语句的代码风格:

(5)如果出现嵌套的{},则使用缩进对齐。

3.空格和空行

需要空格的情况主要有以下几种。

●if、while、switch等关键字与之后的左括号“(”之间,例如“for(i=0;i<10;i++)”;

●双目运算符两侧,例如“p==NULL”;

●逗号“,”与分号“;”之后,例如“for(i=0;i<10;i++)”。

不需要添加空格的情况有以下几种。

●函数名与之后的左括号“(”,包括带参数的宏与之后的左括号“(”,例如“max(a,b)”;

●分号“;”或冒号“:”之前;

●左括号“(”右边,右括号“)”左边,例如“if(p==NULL)”。

空行起到分隔程序段落的作用,需要添加空行的情况主要有以下几种。

(1)函数定义之前、每个函数定义结束之后加空行,例如下面的代码。

(2)在一个函数体内,相邻两组逻辑上密切相关的语句块之间加空行,语句块内不加空行,例如下面的代码。

4.长行拆分

代码行不宜过长,应控制在10个单词或70~80个字符,实在太长时要在适当位置拆分。折行后应该如何缩进?好的做法是,第一次折行后,在原来缩进的基础上增加Tab空格的1/2,之后的折行全部对齐第二行,例如下面的代码。

5.修饰符*和&的位置

从语义上讲,修饰符*和&靠近数据类型会更直观,但对多个变量声明时容易引起误解,例如下面的代码。

int* x,y;

上面的代码中定义了int*型变量x和int型变量y,但由于修饰符*靠近int,因此会让人误以为y的数据类型是int*型的,这样是不对的。

基于上面示例代码造成的误解,人们提倡修饰符*和&靠近变量名,例如下面的代码。

int *x,y;

上面的代码能使人们一眼看出,变量x是int*型,而y是int型的,不会造成误解。

1.4.2 程序注释

注释是对程序的某个功能或者某行代码的解释说明,它只在C语言源文件中有效,在编译时会被编译器忽略。由于对于注释部分忽略不处理,就如同没有这些字符一样,所以注释不会增加编译后的程序的可执行代码长度,对程序运行不起任何作用。注释不仅是给团队合作者看的,也是给自己看的,明确的注释可以让读者阅读、复用、理解和修改代码变得轻松,写注释时力求简单明了、清楚无误,防止产生歧义。注释需要注意以下两点。

1.单行注释

单行注释通常用于对程序中的某一行代码进行解释,用“//”符号表示,“//”后面为被注释的内容,具体示例如下:

printf("Hello,world\n");  //输出“Hello,world”

2.多行注释

顾名思义,多行注释就是在注释中的内容可以为多行,它以符号“/*”开头,以符号“*/”结尾,具体示例如下:

/*  printf("Hello,world\n");

return 0;*/

脚下留心

在C语言中,有的注释可以嵌套使用,有的则不可以,下面列出两种具体的情况。

1.多行注释“/*…*/”中可以嵌套单行注释“//”,例如:

/*printf("Hello,world\n");//输出Hello,world

return 0;*/

2.多行注释“/*…*/”中不能嵌套多行注释“/*…*/”,例如:

上面的代码无法通过编译,原因在于第一个“/*”会和第一个“*/”进行配对,而第二个“*/”则找不到匹配的“/*”。

现在的编程开发都是多人合作,规范的注释更方便别人看懂代码,也便于后期的代码维护。因此,注释规范是编程的良好习惯。

1.4.3 命名规则

对函数名或变量名进行命名的基本原则有以下几点。

●直观、可以拼读、见名知意、不必解码,例如intnum。

●最好采用英文单词或其组合,例如char username[100];,切忌用汉语拼音。

●尽量避免出现数字编号。

●不要出现仅靠大小写区分的相似的标识符。

●不要出现名字完全相同的局部变量和全局变量。

●用正确的反义词组命名具有互斥意义的变量或相反动作的函数。

现在比较著名的命名规则首推匈牙利命名法,这种命名方法是由Microsoft程序员查尔斯·西蒙尼(Charles Simonyi)提出的,其主要思想是“在变量和函数名中加入前缀以增进人们对程序的理解”。

匈牙利命名法的关键有以下几点。

●标识符的名字以一个或者多个小写字母开头作为前缀;

●前缀之后的是首字母大写的一个单词或多个单词组合,该单词要指明变量的用途。

例如变量“lpszStr”,表示指向一个以“\0”结尾的字符串(sz)的长指针(lp)变量。

多学一招:驼峰命名法

驼峰(Camel)命名法近年来越来越流行。骆驼命名法,正如它的名称所表示的那样,指的是混合使用大小写字母来构成标识符的名字。

其中第一个单词首字母小写,余下的单词首字母大写。

例如:printEmployeePaychecks(),函数名中每一个逻辑断点都有一个大写字母来标记。