程序排版和注释非程序功能的组成部分,但清晰、美观的排版和准确、简洁的注释均可增强程序的可读性。
缩进可以体现语句块的层次关系。一般采用4个空格或1个Tab字符缩进。若采用Tab字符缩进,可将编辑器Tab字符宽度设置为4。不要在代码中混合使用Tab字符和空格来进行代码缩进。
使用空行的目的在于分隔程序段落,使程序布局更加清晰。每个函数定义之后应加空行。函数体内一组变量定义之后应加空行,函数体内一段逻辑相对独立的代码之后应加空行。
一行代码只做一件事会使程序易于阅读和注释。如果可能,则应在定义变量的同时初始化。if、for、do、while、switch等语句应单独成行,其执行语句部分应另起一行,并且即使执行语句只有一行也应用花括号括起来。例如:
if ((tmp = fopen("tmp.txt", "w")) == NULL) { printf("Can’t create tmp.txt file\n"); }长句(大于80个字符)应拆行,拆分出的新行要进行适当的缩进,使排版整齐,语句易读。例如:
struct key keyTable[] = { "auto", 0, "break", 0, "case", 0, "char", 0, "const", 0, "continue", 0, "default", 0, "do", 0, "double", 0, "else", 0, "enum", 0, "extern", 0, ...... }; fprintf(fp, "%s %c %s %s\n", (p->data).name, (p->data).sex, (p->data).tel, (p->data).email); printf("This is such a long sentence that " "it cannot be held within a line\n");一元运算符前后不要空格,二元运算符两侧应有一个空格。例如:
i++; i = i + 1;操作符‘[]’,‘→’,‘.’前后不要空格。例如:
strcpy((n->data).name, buffer.name);关键字if、for、do、while、switch等与其后的控制表达式的左括号‘(’之间应有一个空格,但左括号‘(’的右边及右括号‘)’的左边不要空格。当if、for、while、switch等语句采用紧凑型写法时,右括号‘)’与左花括号‘{’之间应有一个空格。for语句分号‘;’后应有一个空格。例如:
for (i = 0; i < c; i++) { if (strcmp(r[i].email, e) == 0) { return i; } }函数参数个数大于1时,每个逗号‘,’后面应有空格。函数名与紧跟的左括号‘(’之间不要空格。例如:
int MyStrncmp(const char *s1, const char *s2, int len);语句if、for、do、while、switch等有“紧凑型”和“清晰型”两种对齐风格,应保持风格一致,不要混合使用。例如:
/* 紧凑型 */ if (argc < 2) { int i; ...... } /* 清晰性 */ if (argc < 2) { int i; ...... }定义函数时,左花括号另起且独占一行,并与函数对齐。{ }之内的代码块在‘{’右侧4个空格或Tab字符处左对齐。例如:
int MyStrlen(const char *s) { int length = 0; ...... }操作符‘’靠近数据类型时,语义直观,但容易造成误解,操作符‘’靠近变量名可避免误解。例如:int x, y; / 操作符靠近数据类型,y容易被误解为指针变量 /int x, y; / 操作符靠近变量名,y不会被误解为指针变量 /
注释有助于程序的阅读,注释语言必须准确、简洁。注释主要说明代码“能做什么”,而非“怎样做”,“怎样做”由代码本身说明。函数、变量、常量等标识符的命名应尽量体现其含义,以减少不必要的注释。应边写代码边注释,修改代码的同时修改注释。
文件注释文件注释位于头文件和定义文件的开头,内容可包括版权信息、文件名称、文件描述、当前版本号、作者、修改者、完成日期等。本书中的示例文件注释仅列出了文件名、文件描述和作者。例如: /* * 文件名: keyword.c * 描述: 统计C程序中的关键字 * 作者: 刘博 */ 函数注释函数注释内容可包括函数功能、输入参数、输出参数、返回值等,写在函数定义之上,与函数定义之间不留空行。例如(本书中的示例函数注释仅列出了函数功能): * * 函数功能: 计算字符串s的长度 * 输入参数: 字符串s * 输出参数: 无 * 返回值: 字符串长度 */ int MyStrlen(const char *s) { ...... } 代码行注释注释应与被描述的代码相邻,可以放置于代码的上方或右方。函数、变量、常量等标识符的命名若无法充分体现其含义,应进行注释。代码块行数较多或者逻辑较复杂时,应在段落结束处进行注释。