高质量C /C编程指南---第2章 程序的版式

第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-2if、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) 以举动为中央的版式



版权声明: 原创作品,答应转载,转载时请务必以超链接体式花式标明文章 原始出处 、作者信息和本声明。不然将追究司法责任。

posted @ 2011-03-07 15:45  蓝色的天空III  阅读(145)  评论(0编辑  收藏  举报