《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. 代码行注释
    注释应与被描述的代码相邻,可以放置于代码的上方或右方。函数、变量、常量等标识符的命名若无法充分体现其含义,应进行注释。代码块行数较多或者逻辑较复杂时,应在段落结束处进行注释。
相关文章
|
1月前
|
编译器 开发工具 C语言
【C语言】第一回(源(.c)文件怎么生成可执程序(.exe)文件)
【C语言】第一回(源(.c)文件怎么生成可执程序(.exe)文件)
|
1月前
|
存储 编译器 C语言
深入探索C语言动态内存分配:释放你的程序潜力
深入探索C语言动态内存分配:释放你的程序潜力
28 1
|
2月前
|
存储 自然语言处理 小程序
最简单的c语言程序
最简单的c语言程序
20 6
|
2月前
|
C语言
最简单的C语言程序示例
最简单的C语言程序示例
23 0
|
29天前
|
存储 编译器 C语言
深入探索C语言动态内存分配:释放你的程序潜力
深入探索C语言动态内存分配:释放你的程序潜力
30 0
|
1天前
|
自然语言处理 编译器 C语言
C语言程序编译和链接
在ANSI C的任何⼀种实现中,存在两个不同的环境。 第1种是翻译环境,在这个环境中源代码被转换为可执⾏的机器指令(⼆进制指令)。 第2种是执⾏环境,它⽤于实际执⾏代码。
|
3天前
|
网络协议 物联网 数据处理
【C 言专栏】C 语言实现网络通信程序
【5月更文挑战第4天】本文探讨了使用C语言实现网络通信程序的方法,包括理解网络通信基本概念如协议和套接字,以及TCP/UDP通信的实现步骤。通过创建套接字、绑定端口、监听连接、数据传输和错误处理等关键环节,阐述了C语言在网络通信中的优势。文中还提到了实际应用案例、程序优化策略及未来发展趋势,旨在帮助读者掌握C语言在网络通信领域的应用技巧。
【C 言专栏】C 语言实现网络通信程序
|
5天前
|
并行计算 算法 测试技术
【C 言专栏】优化 C 语言程序性能的策略
【5月更文挑战第2天】本文探讨了优化C语言程序性能的策略,包括算法优化(选择合适的时间和空间复杂度)、代码结构优化(减少函数调用,合理使用循环)、内存管理优化(合理分配和及时释放内存)、编译器优化(选择优化级别,内联函数,循环展开)、数据结构优化(根据需求选择数组、哈希表或堆)、并行计算优化(多线程、多进程和MPI编程)以及性能测试与分析(使用性能分析工具、基准测试和分析执行路径)。通过这些方法,可以提升C语言程序的效率和运行速度。
|
6天前
|
存储 Linux C语言
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)-2
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)
|
6天前
|
自然语言处理 Linux 编译器
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)-1
C语言进阶第十一节 --------程序环境和预处理(包含宏的解释)