3.1 一行只写一条语句
此处所谓的“行”(line)值得是在编辑器上显示的行,而不是C语言的一条“语句”。
3.2 区分声明语句和执行语句
通过插入空行进行区分声明语句和执行语句。
分析语句对数据会产生何种“直接”影响,可以轻松区分声明语句和执行语句。无论是输出、输入数据,或内存中的保存数据,只要是对数据进行处理和操作的语句,都可以视为执行语句。当然,比较数据的条件语句也是执行语句之一。
代码越长,该准则带来的效果越明显。特别是对于C++程序中变量声明位于程序中段的情况,更要注意遵循这一准则,即在声明语句前后各插入一行空行进行标注。
3.3 区分段落
在编写程序时,无论是声明语句还是执行语句,都应该注意将相似的部分集中在一起。有经验的程序员会有意将负责相似功能的执行语句集中在一起,并在其前后插入空行,以便区分于其他语句。程序编写者应该按一下5部分分段编写函数内容:
- 包含标准库的预处理命令
- 定义字符串常量的预处理命令
- 声明用户信息相关的结构体
- 声明从插入、更新、删除功能中三选一的函数原型
- 声明插入、更新、删除相关的函数原型
3.4 区分各种控制语句
表达统一思想的段落内部也应该插入空行,以划分更细的层次。最常见的情况是针对控制语句。
控制语句担负着改变程序执行顺序的作用,不同假定条件、不同情况下如何进行选择或循环,都由这些控制语句决定,直接关系到程序执行顺序是否正确。
if (num1 == num2)
printf("%d和%d相同。\n", num1, num2);
if (num1 != num2)
printf("%d和%d不同。\n", num1, num2);
if (num1 < num2)
printf("%d小于%d。\n", num1, num2);
switch语句适用的准则整理如下。switch语句越长、越复杂,该准则的作用就越强大。
- switch语句开始部分单独占据一行
- 以空行区分各case语句
- 像case语句一样,用空行隔开default语句,以示区分
对于相互重叠的多种控制结构,每次变换控制语句的种类时都插入空行。
3.5 区分各函数
函数之间无空行的缺点:
- 难以掌握函数的起始位置和结束位置
- 难以了解程序由几个函数组成
- 难以定位某个特定函数
建议各函数之间最少插入两个空行,因为这样可以保证各函数之间的间距更大,如果依序阅读函数内部代码时,如果遇到间距较大的位置,就能自然而然地意识到下面开始是一个新的函数。
3.6 运算符前后需留出空格
3.7 不要在一元运算符与操作数之间插入空格
3.8 分号前不要插入空格
有时,人们会在分号前面插入若干空格,以对齐各语句末尾部分。但这种情况也会导致疑问:“分号和语句之间是否漏掉了某些标识符?”,因此,不要在分号前插入空格。
3.9 不要滥用Tab键
3.10 逗号后必须插入一个空格
更容易区分各参数
3.11 逗号后不要插入太多空格
过多空格同样会损害代码可读性。如果要表示强调,可以按照特定格式,通过添加注释强调特定语句。
3.12 变量初始化时的列对齐
int main(int, int) {
int enterYear = 2012;
int enterMonth = 01;
int exitYear = 2015;
int exitMonth = 12;
int newItemStock = 0;
int newItemFlow = 0;
long double statofNewItemStock = 0;
long double statofOldItemStock = 0;
double bankCredit = 0;
double bankDebit = 0;
// ……略……
}
将变量的声明语句和执行语句分别集中到不同部分,这样有利于管理变量。并且还可以使用Tab键,对齐各变量初始值所在列,如下所示:
int main(int, int) {
int enterYear = 2012;
int enterMonth = 01;
int exitYear = 2015;
int exitMonth = 12;
int newItemStock = 0;
int newItemFlow = 0;
long double statofNewItemStock = 0;
long double statofOldItemStock = 0;
double bankCredit = 0;
double bankDebit = 0;
// ……略……
}
这种对齐初始值所在列的方法很常见。但如果仅仅为了遵守公司“对齐初始值所在列”的编码规则而机械化地对齐,反而会损害代码可读性。公司制定这条规则地本意是,在提高而不是损害可读性地范围内对齐列。因此,应该在合适地范围内,即不能插入过多空格地前提下,对齐初始值所在列。
int main(int, int) {
int enterYear = 2012;
int enterMonth = 01;
int exitYear = 2015;
int exitMonth = 12;
int newItemStock = 0;
int newItemFlow = 0;
long double statofNewItemStock = 0;
long double statofOldItemStock = 0;
double bankCredit = 0;
double bankDebit = 0;
// ……略……
}
总之,初始值应该按列对齐,但也要考虑变量的含义,通过空格的多少控制不同含义的变量初始值在不同位置对齐。
3.13 一行只声明一个变量
有些程序员会在同一行声明多个变量,如下所示:
int number1, number2, number3;
double number4, number5, number6;
无论这种形式的标记方法是否简便,它都存在其他问题。仅从程序的标记形式看,似乎并没有什么问题。但实际上,C编译器会将上述变量声明代码翻译为如下形式:
int number1, int number2, int number3;
double number4, int number5, int number6;
为什么会这样呢?在C语言中,如果变量前面没有指明变量类型,那么会默认将变量的数据类型指定为int型。这也就导致了与程序员意愿相违背的编译结果。
因此,如果考虑准备制定编码风格规则,那么应该规定“一行只声明一个变量”。