第2章 程序的版式
版式固然不会影响程序的成效,但会影响可读性。程序的版式追求分明、雅观,是程序作风的次要组成要素。
可以把程序的版式比喻为“书法”。好的“书法”可让人对程序一目明白,看得兴致勃勃。差的程序“书法”如螃蟹匍匐,让人看得枯燥风趣,更令维护者烦末路有加。请程序员们进修程序的“书法”,赔偿除夜学盘算机教育的坏处,着实很有必要。
2.1 空行
空行起着分隔隔离分散程序段落的作用。空行得体(不过多也不过少)将使程序的组织愈加分明。空行不会华侈内存,固然打印含有空行的程序是会多耗损一些纸张,然则值得。所以不要舍不得用空行。
l 【礼貌2-1-1】在每个类声明之后、每个函数定义完毕之后都要加空行。拜赐教例2-1(a)
l 【礼貌2-1-2】在一个函数体内,逻揖上慎密亲密相关的语句之间不加空行,另外中央应加空行分隔隔离分散。拜赐教例2-1(b )
// 空行
void Function1(…)
{
…
}
// 空行
void Function2(…)
{
…
}
// 空行
void Function3(…)
{
…
}
// 空行
while (condition)
{
statement1;
// 空行
if (condition)
{
statement2;
}
else
{
statement3;
}
// 空行
statement4;
}
示例2-1(a) 函数之间的空行 示例2-1(b) 函数内部的空行
2.2 代码行
l 【礼貌2-2-1】一行代码只做一件事变,如只定义一个变量,或只写一条语句。这样的代码苟且阅读,而且利便于写注释。
l 【礼貌2-2-2】if、for、while、do等语句自占一行,执行语句不得紧跟后来。不论执行语句有多少都要加{}。如答应以防止誊写丢失误。
示例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; z = e f;
if (width < height)
{
dosomething();
}
if (width < height) dosomething();
for (initialization; condition; update)
{
dosomething();
}
// 空行
other();
for (initialization; condition; update)
dosomething();
other();
示例2-2(a) 作风优秀的代码行 示例2-2(b) 作风不良的代码行
² 【发起2-2-1】尽可以在定义变量的同时初始化该变量(就近绳尺)
要是变量的引用处和其定义处相隔比较远,变量的初始化很苟且被健忘。要是引用了未被初始化的变量,可以会招致程序错误。本发起可以扩充隐患。例如
int width = 10; // 定义并初绐化width
int height = 10; // 定义并初绐化height
int depth = 10; // 定义并初绐化depth
2.3 代码行内的空格
l 【礼貌2-3-1】环节字之后要留空格。象const、virtual、inline、case 等环节字之后至少要留一个空格,不然无法辨析环节字。象if、for、while等环节字之后应留一个空格再跟左括号‘(’,以凸起环节字。
l 【礼貌2-3-2】函数名之后不要留空格,紧跟左括号‘(’,以与环节字区别。
l 【礼貌2-3-3】‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。
l 【礼貌2-3-4】‘,’之后要留空格,如Function(x, y, z)。要是‘;’不是一行的完毕符号,后来要留空格,如for (initialization; condition; update)。
l 【礼貌2-3-5】赋值哄骗符、比较哄骗符、算术哄骗符、逻辑哄骗符、位域哄骗符,如“=”、“ =” “>=”、“<=”、“ ”、“*”、“%”、“&&”、“||”、“<<”,“^”等二元哄骗符的前后该当加空格。
l 【礼貌2-3-6】一元哄骗符如“!”、“~”、“ ”、“--”、“&”(地点运算符)等前后不加空格。
l 【礼貌2-3-7】象“[]”、“.”、“->”这类哄骗符前后不加空格。
² 【发起2-3-1】关于表达式比较长的for语句和if语句,为了紧凑起见可以合适地去丢失一些空格,如for (i=0; i<10; i )和if ((a<=b) && (c<=d))
void Func1(int x, int y, int z); // 优秀的作风
void Func1 (int x,int y,int z); // 不良的作风
if (year >= 2000) // 优秀的作风
if(year>=2000) // 不良的作风
if ((a>=b) && (c<=d)) // 优秀的作风
if(a>=b&&c<=d) // 不良的作风
for (i=0; i<10; i ) // 优秀的作风
for(i=0;i<10;i ) // 不良的作风
for (i = 0; I < 10; i ) // 过多的空格
x = a < b ? a : b; // 优秀的作风
x=a<b?a:b; // 不好的作风
int *x = &y; // 优秀的作风
int * x = & y; // 不良的作风
array[5] = 0; // 不要写成 array [ 5 ] = 0;
a.Function(); // 不要写成 a . Function();
b->Function(); // 不要写成 b -> Function();
示例2-3 代码行内的空格
2.4 对齐
l 【礼貌2-4-1】程序的分界符‘{’和‘}’应独有一行而且位于同等列,同时与引用它们的语句左对齐。
l 【礼貌2-4-2】{ }之内的代码块在‘{’左边数格处左对齐。
示例2-4(a)为作风优秀的对齐,示例2-4(b)为作风不良的对齐。
void Function(int x)
{
… // program code
}
void Function(int x){
… // program code
}
if (condition)
{
… // program code
}
else
{
… // program code
}
if (condition){
… // program code
}
else {
… // program code
}
for (initialization; condition; update)
{
… // program code
}
for (initialization; condition; update){
… // program code
}
While (condition)
{
… // program code
}
while (condition){
… // program code
}
要是泛起嵌套的{},则运用缩进对齐,如:
{
…
{
…
}
…
}
示例2-4(a) 作风优秀的对齐 示例2-4(b) 作风不良的对齐
2.5 长行拆分
l 【礼貌2-5-1】代码行最除夜长度宜节制在70至80个字符以内。代码行不要过长,不然眼睛看不过去,也利便于打印。
l 【礼貌2-5-2】长表达式要在低优先级哄骗符处拆分红新行,哄骗符放在新行之首(以便凸起哄骗符)。拆分出的新行要遏制合适的缩进,使排版整洁,语句可读。
if ((very_longer_variable1 >= very_longer_variable12)
&& (very_longer_variable3 <= very_longer_variable14)
&& (very_longer_variable5 <= very_longer_variable16))
{
dosomething();
}
virtual CMatrix CMultiplyMatrix (CMatrix leftMatrix,
CMatrix rightMatrix);
for (very_longer_initialization;
very_longer_condition;
very_longer_update)
{
dosomething();
}
示例2-5 长行的拆分
2.6 修饰符的地位
修饰符 * 和 & 应该接近数据典范模范照旧该接近变量名,是个有争议的活题。
若将修饰符 * 接近数据典范模范,例如:int* x; 从语义上讲此写法比较直观,即x是int 典范模范的指针。
上述写法的短处是苟且惹起误解,例如:int* x, y; 此处y苟且被误解为指针变量。固然将x和y分行定义可以遏制误解,但并不是除夜家都快乐愿意这样做。
l 【礼貌2-6-1】该当将修饰符 * 和 & 紧靠变量名
例如:
char *name;
int *x, y; // 此处y不会被误解为指针
2.7 注释
C言语的注释符为“/*…*/”。C 言语中,程序块的注释常授与“/*…*/”,行注释一样寻常授与“//…”。注释反复用于:
(1)版本、版权声明;
(2)函数接口声名;
(3)次要的代码行或段落提示。
固然注释有助于清晰代码,但注意不可过多地运用注释。拜赐教例2-6。
l 【礼貌2-7-1】注释是对代码的“提示”,而不是文档。程序中的注释不可喧宾夺主,注释太多了会让人目眩混乱。注释的魔术要少。
l 【礼貌2-7-2】要是代码原本便是分明的,则不必加注释。不然多此一举,令人厌烦。例如
i ; // i 加 1,多余的注释
l 【礼貌2-7-3】边写代码边注释,修正代码同时修正相应的注释,以包管注释与代码的分比喻性。不再有效的注释要删除。
l 【礼貌2-7-4】注释该当正确、易懂,防止注释有二义性。错误的注释不只无益反而无害。
l 【礼貌2-7-5】尽节遏制在注释中运用缩写,新鲜是不常用缩写。
l 【礼貌2-7-6】注释的地位应与被描绘的代码相邻,可以放在代码的上方或右方,不可放在下方。
l 【礼貌2-7-8】现代码比较长,新鲜是有多重嵌套时,该当在一些段落的完毕处加注释,便于阅读。
/*
* 函数先容:
* 输入参数:
* 输入参数:
* 前去值 :
*/
void Function(float x, float y, float z)
{
…
}
if (…)
{
…
while (…)
{
…
} // end of while
…
} // end of if
示例2-6 程序的注释
2.8 类的版式
类可以将数据和函数封装在一同,其中函数透露表现了类的举动(或称办事)。类供应环节字public、protected和private,判袂用于声明哪些数据和函数是私有的、受维护的梗概是私有的。如答应以达到信息淹没的目的,即让类仅仅地下必必要让外界知道的内容,而淹没另外通通内容。我们不可以滥用类的封装成效,不要把它当成暖锅,什么器械都往里扔。
类的版式次要有两种编制:
(1)将private典范模范的数据写在背面,而将public典范模范的函数写在背面,如示例8-3(a)。授与这种版式的程序员主张类的企图“以数据为中央”,重点关注类的内部组织。
(2)将public典范模范的函数写在背面,而将private典范模范的数据写在背面,如示例8.3(b)授与这种版式的程序员主张类的企图“以举动为中央”,重点关注的是类应该供应什么样的接口(或办事)。
许多C 教课书遭到Biarne Stroustrup第一本著作的影响,不知不觉地授与了“以数据为中央”的誊写编制,并不见得有多少事理。
我发起读者授与“以举动为中央”的誊写编制,即起首思考类应该供应什么样的函数。这是许多人的阅历——“这样做不但让自己在企图类时思路分明,而且利便他人阅读。由于用户最体恤的是接口,谁快乐愿意先看到一堆私罕有据成员!”
>
{
private:
int i, j;
float x, y;
…
public:
void Func1(void);
void Func2(void);
…
}
>
{
public:
void Func1(void);
void Func2(void);
…
private:
int i, j;
float x, y;
…
}
示例8.3(a) 以数据为中央版式 示例8.3(b) 以举动为中央的版式
版权声明: 原创作品,答应转载,转载时请务必以超链接体式花式标明文章 原始出处 、作者信息和本声明。不然将追究司法责任。