代码风格 - 写C语言代码时应该注意的一些事情
缩进
C语言不是依靠缩进进行语法分析的语言, 所以你大可以把你的代码压缩至仅有一行的形式, 但是这种代码的可阅读性是非常之低的, 所以在网络上看到的大部分示例代码都是格式很好易于阅读的, 其中比较重要的第一条就是缩进.
缩进就是指人为的使用空格或者制表符使代码显得更加富有层次感, 一般的编辑器都会有自动缩进的功能, 根据每个人写代码的习惯的不同, 缩进方式也会略有不同, 但是有些问题是大同小异, 所有人都要注意到的:
空格和制表符的区别
大多数的编辑器在支持自动缩进功能以后, 会自动在代码中插入空格或者制表符来符合一定的缩进标准: 比如说代码块之间使用一个制表符或者4个空格来进行缩进.
举例, 我的电脑环境上的Sublime Text 3使用的自动缩进的方式是一个Tab, 但是我的Vscode使用的自动缩进是4个空格, 这样的话如果我的一段代码使用两个编辑器编写以后, 代码中就同时使用了Tab和Space来进行缩进.
在某些情况下这看起来没什么问题, 这是因为在不同的编辑器中有显示的形式: 空格就是正常的显示, 但是Tab会有很多中显示的方式, 比如常见的2-space, 4-space和8-space, 正是因为有很多不同的缩进方式, 所以会有很多不同的显示方式. 如果在你的工作环境中使用的方式是4-space, 那么你平时使用4个空格进行缩进就不会有什么问题, 但是换到另外一种环境中, 比如github的代码显示的时候, 很多时候是8-space, 也就是一个制表符显示为8个空格的宽度, 这样你的代码就会变得奇奇妙妙.
奇奇妙妙, JOJO的奇妙代码是不会有人想看的.
所以就是建议统一自己写代码的缩进风格, 不要在同一个项目中使用不同的缩进风格: 要使用制表符就都使用制表符, 要使用空格就都使用空格.
注释
注释的意义在于让代码具有更好的可阅读性, 让别人和自己都能够看懂自己写的代码(如果有时让我看一年前我写的一段没有注释的代码, 我铁定也要看一阵子才能够弄明白其中的意义), 所以好的习惯就是在代码中加上注释.
一般的注释分为以下几种:
- 代码的开头, 用于解释代码的路径, 依赖, 作用等等, 是比较全局和大体的描述
- 函数的开头, 用于解释函数的功能和作用, 使用的条件, 应该传入的参数, 会返回的返回值, 参数和返回值的意义, (如果是弱类型语言还应该声明参数和返回值的类型).
- 每个具有独立逻辑意义的代码块, 需要添加注释来解释作用
- 较为晦涩难懂的语句, 比如冗长的位运算语句, 需要特殊说明
- 后期维护的更改, 需要添加注释标注修改信息(其实看git commit history就还好)
代码块
代码块, 就是指一段代码中关系紧密, 实现统一功能的代码片段, 比如说循环结构中的循环体, 分支结构中的不同分支, 顺序结构中不同的区段, 都可以看作是代码块, 而代码块中也会包含代码块, 因此为了能够更加清晰的阅读代码, 一般我们会将不同的代码块隔开.
空格
在不同的代码风格中, 语言内置关键字和符号周围会分布有不同数量的空格, 这里推荐大家使用相同的习惯:
非独立的左大括号和关键字之间应该加上空格
if (...) { // 之间有空格
} else {
}
for (...) { // 之间有空格
}
void print(int a) { // 之间有空格
}
struct Info { // 之间有空格
}
非参数传递中的运算符两边应该附有空格
int a = 1, b = 2, c; // 赋值运算符两边应该有空格
c = a + b * (a * b); // 括号要贴近表达式
for (int i = 0; i < n; i ++) { // 句子之间要使用空格分开
}
while(! a == 0) {
}
参数传递中的运算符应该紧贴
print(a*b+c);
get_params(str[1]+str[2]);
有很多不同的代码规范, 我说的只是其中的一种而已, 每个人在写代码的时候都会形成自己的代码风格, 但是还是要有一个基本原则: 代码可读性高. 因此就是说, 不管遵循什么样子的代码规范, 最终还是要让代码显得整洁, 能让除了自己以外的人很快能看懂.