目录
前言
第二章
2.1 空行
2.2 代码行
2.3 代码行内的空格
2.4 对齐
2.5 长行拆分
2.6 修饰符的位置
2.7 注释
首先声明,文章内容并非原创,而是从林锐博士所著的《高质量的C/C++编程》书籍摘要总结并加上了一部分我自己的理解而来,从中截取了一些我们在C语言中常用到的一些规则,一些内容我们在初始阶段用不到,所以对其进行了删减,主要是为了减轻大家的阅读负担,这个系列就是为了帮助大家写出规范、美观的代码,下面正文内容即将开始!
在开始正文之前,先告诉大家一个快捷键,ctrl + k + f代码自动对齐!!!
空行起着分隔程序段落的作用。空行得体(不过多也不过少)将使程序的布局更加 清晰。空行不会浪费内存,反而会使代码具有更好的可读性,层次更加分明,程序更加美观。
规则2.1.1 在每个类声明之后、每个函数定义结束之后都要加空行。
规则2.1.2 在一个函数体内,逻揖上密切相关的语句之间不加空行,其它地方应 加空行分隔。
示例:
函数之间的空行 // 空行 void Function1(…) { … } // 空行 void Function2(…) { … } // 空行 void Function3(…) { … }
函数内部之间的空行 // 空行 while (condition) { statement1; // 空行 if (condition) { statement2; } else { statement3; } // 空行 statement4; }
规则2.2.1 一行代码只做一件事情,如只定义一个变量,或只写一条语句。这样 的代码容易阅读,并且方便于写注释。
规则 2-2-2 if、for、while、do 等语句自占一行,执行语句不得紧跟其后。不论执行语句有多少都要加{}。这样可以防止书写失误。(我们可能一开始只想在条件后面执行一条语句,但后来想在原来的基础上再加一条或多条语句,此时容易忘记加{})
示例:
int width; // 宽度 int height; // 高度 int depth; // 深度 x = a + b; y = c + d; z = e + f; if (width < height) { dosomething(); } for (initialization; condition; update) { dosomething(); } // 空行 other();
建议2.2.1 尽可能在定义变量的同时初始化该变量(就近原则)
如果变量的引用处和其定义处相隔比较远,变量的初始化很容易被忘记。如果引用 了未被初始化的变量,可能会导致程序错误。本建议可以减少隐患。另一个原因就是我们初始化的变量在后续进行条件判断时可能会具有某些意义。
示例:
int width = 10; // 定义并初绐化 width int height = 10; // 定义并初绐化 height int depth = 10; // 定义并初绐化 depth
规则2.3.1 关键字之后要留空格。像const、virtual、inline、case 等关键字之后至少要留一个空格,否则无法辨析关键字。像 if、for、while 等关键字之后应留一个空格再跟左括号‘(’,以突出关键字。
规则2.3.2 函数名之后不要留空格,紧跟左括号‘(’,以与关键字区别。
规则2.3.3 ‘(’向后紧跟,‘)’、‘,’、‘;’向前紧跟,紧跟处不留空格。(向后紧跟即后面不留空格,向前紧跟即前面不留空格)
规则2.3.4 ‘,’之后要留空格,如 Function(x, y, z)。如果‘;’不是一行的结束 符号,其后要留空格,如 for (initialization; condition; update)。
规则2.3.5 赋值操作符、比较操作符、算术操作符、逻辑操作符、位域操作符, 如“=”、“+=” “>=”、“<=”、“+”、“*”、“%”、“&&”、“||”、“<<”,“^”等二 元操作符的前后应当加空格。
规则2.3.6 一元操作符如“!”、“~”、“++”、“--”、“&”(地址运算符)等前后不加空格。
规则2.3.7 像“[]”、“.”、“->”这类操作符前后不加空格。
建议2.3.1 对于表达式比较长的 for 语句和 if 语句,为了紧凑起见可以适当地去掉一些空格,如 for (i=0; i<10; i++)和 if ((a<=b) && (c<=d))。
示例:
const int a = 7; if (year >= 2000) for (i=0; i<10; i++) x = a < b ? a : b; int *x = &y; array[5] = 0; a.Function(); b->Function();
规则2.4.1 程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用 它们的语句左对齐。
规则2.4.2 { }之内的代码块在‘{’右边数格处左对齐。
示例:
void Function(int x) { … // program code } if (condition) { … // program code } else { … // program code } for (initialization; condition; update) { … // program code } While (condition) { … // program code } 如果出现嵌套的{},则使用缩进对齐,如: { … { … } … }
规则2.5.1 代码行最大长度宜控制在 70 至 80 个字符以内。代码行不要过长,否则眼睛看不过来,也不便于打印。此处给大家补充一下续行符的使用:在语句想要续行的位置使用\,在下一行继续写连接上一行的代码即可。
示例:
规则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(); }
修饰符 * 和 & 应该靠近数据类型还是该靠近变量名,是个有争议的活题。
若将修饰符 * 靠近数据类型,例如:
int* x;
从语义上讲此写法比较直观,即 x 是 int 类型的指针。
上述写法的弊端是容易引起误解,例如:int* x, y; 此处 y 容易被误解为指针变 量。虽然将 x 和 y 分行定义可以避免误解,但并不是人人都愿意这样做。
规则2.6.1 应当将修饰符 * 和 & 紧靠变量名。
例如: char *name; int *x, y; // 此处 y 不会被误解为指针(当然这种定义变量的方法我们并不推荐大家使用)
C 语言的注释符为“/*…*/”。C++语言中,程序块的注释常采用“/*…*/”,行注释 一般采用“//…”。
注释通常用于:
(1)版本、版权声明;
(2)函数接口说明;
(3)重要的代码行或段落提示。
虽然注释有助于理解代码,但注意不可过多地使用注释。
规则2.7.1 注释是对代码的“提示”,而不是文档。程序中的注释不可喧宾夺主, 注释太多了会让人眼花缭乱。注释的花样要少。
规则2.7.2 如果代码本来就是清楚的,则不必加注释。
例如 i++; // i 加 1,多余的注释
规则2.7.3 边写代码边注释,修改代码同时修改相应的注释,以保证注释与代码 的一致性。不再有用的注释要删除。
规则2.7.4 注释应当准确、易懂,防止注释有二义性。错误的注释不但无益反而有害。
规则2.7.5 尽量避免在注释中使用缩写,特别是不常用缩写。
规则2.7.6 注释的位置应与被描述的代码相邻,可以放在代码的上方或右方,不可放在下方。
规则2.7.8 当代码比较长,特别是有多重嵌套时,应当在一些段落的结束处加注释,便于阅读。