《C语言课程设计》一2.2 程序排版和注释-阿里云开发者社区

开发者社区> 华章出版社> 正文
登录阅读全文

《C语言课程设计》一2.2 程序排版和注释

简介: 本节书摘来自华章出版社《C语言课程设计》一书中的第2章,第2.2节,作者 刘博 董学文,更多章节内容可以访问云栖社区“华章计算机”公众号查看

2.2 程序排版和注释

程序排版和注释非程序功能的组成部分,但清晰、美观的排版和准确、简洁的注释均可增强程序的可读性。

2.2.1 缩进与对齐

缩进可以体现语句块的层次关系。一般采用4个空格或1个Tab字符缩进。若采用Tab字符缩进,可将编辑器Tab字符宽度设置为4。不要在代码中混合使用Tab字符和空格来进行代码缩进。

2.2.2 空行

使用空行的目的在于分隔程序段落,使程序布局更加清晰。每个函数定义之后应加空行。函数体内一组变量定义之后应加空行,函数体内一段逻辑相对独立的代码之后应加空行。

2.2.3 代码行

一行代码只做一件事会使程序易于阅读和注释。如果可能,则应在定义变量的同时初始化。
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");

2.2.4 空格

一元运算符前后不要空格,二元运算符两侧应有一个空格。例如:

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);

2.2.5 对齐

语句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;
    ......
}

2.2.6 间接访问操作符‘*’

操作符‘’靠近数据类型时,语义直观,但容易造成误解,操作符‘’靠近变量名可避免误解。例如:
int x, y; / 操作符靠近数据类型,y容易被误解为指针变量 /
int x, y; / 操作符靠近变量名,y不会被误解为指针变量 /

2.2.7 注释

注释有助于程序的阅读,注释语言必须准确、简洁。注释主要说明代码“能做什么”,而非“怎样做”,“怎样做”由代码本身说明。
函数、变量、常量等标识符的命名应尽量体现其含义,以减少不必要的注释。
应边写代码边注释,修改代码的同时修改注释。

  1. 文件注释
    文件注释位于头文件和定义文件的开头,内容可包括版权信息、文件名称、文件描述、当前版本号、作者、修改者、完成日期等。本书中的示例文件注释仅列出了文件名、文件描述和作者。例如:
/*
 * 文件名: keyword.c 
 * 描述: 统计C程序中的关键字
 * 作者: 刘博 
 */
  1. 函数注释
    函数注释内容可包括函数功能、输入参数、输出参数、返回值等,写在函数定义之上,与函数定义之间不留空行。例如(本书中的示例函数注释仅列出了函数功能):

*
 * 函数功能: 计算字符串s的长度
 * 输入参数: 字符串s           
 * 输出参数: 无 
 * 返回值: 字符串长度 
*/
int MyStrlen(const char *s)
{
......
}
  1. 代码行注释
    注释应与被描述的代码相邻,可以放置于代码的上方或右方。函数、变量、常量等标识符的命名若无法充分体现其含义,应进行注释。代码块行数较多或者逻辑较复杂时,应在段落结束处进行注释。

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

分享: