3)\、\、\、\、\(地址操作符)等单目操作符前后不加
空格。
4)\、\前后不加空格。
5)if、for、while、switch等与后面的括号间应加空格,使if等关键字更为突出、明显。
规则10.5注释符(包括?/*??//??*/?)与注释内容之间要用一个空格进行分隔。
说明:这样可以使注释的内容部分更清晰。现在很多工具都可以批量生成、删除'//'注释,这样有空格也比较方便统一处理。 规则 10.6源程序中关系较为紧密的代码应尽可能相邻。
11.对齐
原则11.1 程序的分界符‘{’和‘}’应独占一行并且位于同一列,同时与引用它们的语句左对齐;
原则 11.2 { }之内的代码块在‘{’右边数格处左对齐; 原则 11.3代码的的对齐采用TAB键而不采用空格键对齐,一般TAB键设置为向后空4个空格。 示例
好的代码风格
16 / 19
不好的代码风格
12参数设计规则
原则12.1 参数的书写要完整,不要贪图省事只写参数的类型而省略参数名字,如果函数没有参数,则用void填充。 示例
原则12.2参数命名要恰当,顺序要合理;
17 / 19
例如编写字符串拷贝函数StringCopy,它有两个参数,如果把参数名字起为str1和str2,例如:void StringCopy(char *str1, char *str2);那么我们很难搞清楚究竟是把str1拷贝到str2中,还是刚好倒过来,可以把参数名字起得更有意义,如叫strSource和strDestination。这样从名字上就可以看出应该把strSource拷贝到strDestination。还有一个问题,这两个参数那一个该在前那一个该在后?参数的顺序要遵循程序员的习惯。一般地,应将目的参数放在前面,源参数放在后面。如果将函数声明为:
别人在使用时可能会不假思索地写成如下形式:
原则12.3如果参数是指针,且仅作输入用,则应在类型前加const,以防止该指针在函数体内被意外修改。 示例:
原则12.4 如果输入参数以值传递的方式传递对象,则宜改用“const &”方式来传递,这样可以省去临时对象的构造和析构过程,从而提高效率;
原则12.5 避免函数有太多的参数,参数个数尽量控制在5个以内。如果参数太多,在使用时容易将参数类型或顺序搞错。 原则12.6 尽量不要使用类型和数目不确定的参数;
C标准库函数printf是采用不确定参数的典型代表,其原型为:
这种风格的函数在编译时丧失了严格的类型安全检查。
13返回值的规则
原则13.1 不要省略返回值的类型。
C语言中,凡不加类型说明的函数,一律自动按整型处理,这样做不会有什么好处,却容易被误解为void类型;C++语言有很严格的类型安全检查,不允许上述情况发生。由于C++程序可以调用C函数,为了避免混乱,规定任何C++/ C函数都必须有类型。如果函数没有返回值,那么应声明为void类型。 示例
18 / 19
原则13.2 函数名字与返回值类型在语义上不可冲突;违反这条规则的典型代表是C标准库函数getchar。 示例
按照getchar名字的意思,将变量c声明为char类型是很自然的事情。但不幸的是getchar的确不是char类型,而是int类型,其原型如下: 由于c是char类型,取值范围是[-128,127],如果宏EOF的值在char的取值范围之外,那么if语句将总是失败,这种“危险”人们一般哪里料得到!导致本例错误的责任并不在用户,是函数getchar误导了使用者。
原则13.3 不要将正常值和错误标志混在一起返回。正常值用输出参数获得,而错误标志用return语句返回。
原则13.4 有时候函数原本不需要返回值,但为了增加灵活性如支持链式表达,可以附加返回值;
例如字符串拷贝函数strcpy的原型:
strcpy函数将strSrc拷贝至输出参数strDest中,同时函数的返回值又是strDest。这样做并非多此一举,可以获得如下灵活性:
19 / 19