程序的版式
(转载自林锐博士专著《高质量C++编程指南》第2章)
版式虽然不会影响程序的功能,但会影响可读性。程序的版式追求清晰、美观,是程序风格的重要构成因素。
可以把程序的版式比喻为“书法”。好的“书法”可让人对程序一目了然,看得兴致勃勃。差的程序“书法”如螃蟹爬行,让人看得索然无味,更令维护者烦恼有加。请程序员们学习程序的“书法”,弥补大学计算机教育的漏洞,实在很有必要。
2.1 空行
空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加清晰。空行不会浪费内存,虽然打印含有空行的程序是会多消耗一些纸张,但是值得。所以不要舍不得用空行。
l
【规则
l
【规则
// 空行 void Function1(…) { … } // 空行 void Function2(…) { … } // 空行 void Function3(…) { … }
|
// while { statement1; // 空行 if (condition) { statement2; } else { statement3; } // statement4; } |
示例2-1(a) 函数之间的空行 示例2-1(b) 函数内部的空行
2.2 代码行
l
【规则
l
【规则
示例2-2(a)为风格良好的代码行,示例2-2(b)为风格不良的代码行。
int width; // 宽度 int height; // 高度 int depth; // 深度 |
int width, height, depth; // 宽度高度深度
|
x = a + b; y = c + d; z = e + f; |
X = a + b; y = c + d;
|
if (width < height) { dosomething(); } |
if (width < height) dosomething(); |
for (initialization; condition; update) { dosomething(); } // 空行 other();
|
for (initialization; condition; update) other();
|
示例2-2(a) 风格良好的代码行 示例2-2(b)
风格不良的代码行
²
【建议
如果变量的引用处和其定义处相隔比较远,变量的初始化很容易被忘记。如果引用了未被初始化的变量,可能会导致程序错误。本建议可以减少隐患。例如
int width = 10; // 定义并初绐化width
int height = 10; // 定义并初绐化height
int depth = 10; //
定义并初绐化depth
2.3 代码行内的空格
l
【规则
l
【规则
l
【规则
l
【规则
l
【规则
“>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元操作符的前后应当加空格。
l
【规则
l
【规则
²
【建议
(c<=d))
void Func1(int x, void Func1 (int |
if (year >= if(year>=2000) // 不良的风格 if ((a>=b) if(a>=b&&c<=d) // 不良的风格 |
for (i=0; i<10; for(i=0;i<10;i++) // 不良的风格 for (i = 0; I < |
x = a < b ? a : x=a<b?a:b; // 不好的风格 |
int *x = &y; // 良好的风格 int * x = & |
array[5] = 0; // 不要写成 array [ 5 ] = 0; a.Function(); // 不要写成 a . Function(); b->Function(); // 不要写成 b -> Function();
|
示例2-3 代码行内的空格
2.4 对齐
l
【规则
l
【规则
示例2-4(a)为风格良好的对齐,示例2-4(b)为风格不良的对齐。
void Function(int x) { … // program } |
void Function(int x){ … }
|
if (condition) { … // program } else { … // program } |
if (condition){ … // program } else { … // program } |
for (initialization; condition; update) { … // program } |
for (initialization; condition; update){ … // program } |
While (condition) { … // program } |
while (condition){ … // program } |
如果出现嵌套的{},则使用缩进对齐,如: { … { … } … } |
|
示例2-4(a) 风格良好的对齐 示例2-4(b) 风格不良的对齐
2.5 长行拆分
l
【规则
l
【规则
if && (very_longer_variable3 <= && (very_longer_variable5 <= { dosomething(); } |
virtual CMatrix CMatrix
|
for very_longer_condition; very_longer_update) { dosomething(); } |
示例2-5 长行的拆分
2.6 修饰符的位置
修饰符
* 和 & 应该靠近数据类型还是该靠近变量名,是个有争议的活题。
若将修饰符 * 靠近数据类型,例如:int* x; 从语义上讲此写法比较直观,即x是int 类型的指针。
上述写法的弊端是容易引起误解,例如:int* x, y; 此处y容易被误解为指针变量。虽然将x和y分行定义可以避免误解,但并不是人人都愿意这样做。
l
【规则
例如:
char *name;
int
*x, y; // 此处y不会被误解为指针
2.7 注释
C语言的注释符为“/*…*/”。C++语言中,程序块的注释常采用“/*…*/”,行注释一般采用“//…”。注释通常用于:
(1)版本、版权声明;
(2)函数接口说明;
(3)重要的代码行或段落提示。
虽然注释有助于理解代码,但注意不可过多地使用注释。参见示例2-6。
l
【规则
l
【规则
i++; //
i 加 1,多余的注释
l
【规则
l
【规则
l
【规则
l
【规则
l
【规则