c++/c语言(高质量程序设计指南林锐建议总结)

第四章C++/C程序设计入门

. 4.1 在使用运算符&&的表达式中,要尽量把最可能为false中的子表达式放在
&&的左边;同样在使用运算符“||”的表达式中,要尽量把最可能为true的表达式放在“||”的左边。因为c++/c对逻辑表达式的判断采取“突然死亡法”(猝死法);

4.2 在if/else中,要尽量把为true的概率较高的条件的条件判断置于前面,这样可以提高段程序的性能。

4.3 如果计数器从0开始计数,则建议for语句的循环控制变量的取值采用“前闭后开”写法。要防止出现差1错误。

4.4 对于多维数组来说,正确的遍历方法要看语言以什么顺序来安排数组元素的存储空间。比如fortran是以“先列后行”的顺序在内存中连续存放数组元素,而c++/c则是以“先行后列”的顺序来连续存储数组元素。因此。以“先行后列”存储的数组就应该以“先行后列”的顺序遍历。

4.5 如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体外面。

第五章 C++/C 常量

5.1尽量使用含义直观的符号变量来表示那些将在程序中多次出现的数字或字符串。

第六章C++/C函数设计基础

6.1 (1)应避免函数有太多的参数,参数的个数尽量控制在5个以内。如果参数太多,在使用时容易将参数类型和顺序搞错,此时,可以将这些参数封装为一个对象并采用地址传递或传递方式。
(2)尽量不要使用类型和数目不确定的参数列表。c标准库函数prinf时采用不确定参数列表的典型列表,其原型为:

int printf(const char *format[,argument]...)

这种风格的函数在编译时丧失了严格的静态类型安全检查。
6.2 不要将正常值错误标志混在一起返回。建议正常值用输出参数获得,而错误标志用return语句返回。
6.3 函数的功能要单一,即一个函数只完成一件事情,不要设计多用途 的函 数。函数体的规模要小,尽量控制在50行代码之内。
6.4 不仅要检查输入参数的有效性,还要检查通过其他途径进入函数体内的变量的有效性,如全局变量、文件句柄。
6.5 用于出错处理的返回值一定要清楚,让使用者不容易忽视或误解错误情况。
6.6 尽量避免函数带有记忆功能,相同的输入应产生相同的输出。带有记忆功能的函数,其行为可能是不可预测的,因为他的行为可能取决于某种 “记忆状态” 。这样的函数既不易于理解又不利于测试和维护,在c++/c语言中,函数static局部变量是函数的记忆存储器。建议少用static局部变量,除非必需,例如static 局部变量可以实现全局常量的封装。

inlie const char * GetWindowsPath(void)
{
  sttic const char *p="C:\\Windows\\";
  return p;

}

6.7 尽管语法允许,但是请不要在内层程序块中定义会遮蔽外层程序块中的同名标识符,否则会损害程序的可理解性。
6.8 不要使用间接递归,即一个函数通过调用另一个函数来调用自己,因为它会损害程序的清晰性。
6.9 在函数的入口处,建议使用断言来检查参数的有效性(合法性)。
6.10 请给asseert语句加注释,告诉人们assert语句究竟要干什么。
6.11 如果输入参数采用“指针传递”,那么加const修饰可以防止意外的改动该指针指向的内存单元,起到保护的作用。

第七章 c++/c指针、数组和字符串

第八章 c++/c高级数据类型

8.1 为了不使程序产生混乱和妨碍理解,建议还使用struct定义简单的数据集合:而定义一些具有行为的ADT时最好采用class,如果采用struct似乎感觉不到面向对象的味道。
8.2 在设计位域的时候,最好不要让一个位域成员跨越一个不完整的字节来存放,因为这样会增加计算机运算的开销,例如,前面的DateTime的设计就不好,比较好的设计应该是:

struct DateTime
{
    unsigned int year;
    unsigned int month  :8;
    unsigned int day    :8;
    unsigned int hour   :8;
    unsigned int minute :8;
    unsigned int second :8;

]

请使用sizeof()运算来计算位域的大小而不是自己估算,因为你很容易估算错误。
8.3 使用匿名枚举来定义程序中出现的相关常量集合是一个好办法,它可以取代宏常量和const符号常量。例如:

扫描二维码关注公众号,回复: 10306705 查看本文章
enum
{
   OBJECT_CREATION  =0X10,
   OBJECT_DELETION  =0X11,
   STATE_CHANGE     =0X12,
   ATTR_VALUE_CHANGE =0X13,
   NEW_ALARM        =0X20,

ALARM_CLEARED   =0X21,
ALRAM_CHANGED    0X22
};

第九章 c++/c编译预处理

9.1(1)虽然宏定义很灵活,并且通过彼此结合可以产生 许多变形用法,但是c++/c程序员不要定义很复杂的宏,宏定义应该简单而清晰。
(2)宏名采用大写字符组成的单词或其缩写序列,并在各单词之间使用"_"分隔。
(3)如果需要公布某个宏,那么该宏定义应当放置在头文件中,否则放置在实现文件(.cpp)的顶部。
(4)不要使用宏来定义新类型名,应该使用typedf,否则容易造成错误。
(5)给宏添加注释时请使用块注释(/* */),而不要使用行注释。因为有些编译器可能会会把宏后面的行注释理解为宏体的一部分。
(6)尽量使用const取代宏来定义符号变量。
(7)对于较长的使用频率较高的重复代码片段,建议使用函数或模板而不要使用带参数的宏定义;而对于较短的重复代码片段,可以使用带参数的宏定义,这不仅是出于类型安全的考虑。而且也是优化与折衷的体现。
(8) 尽量避免在局部范围内(如函数内、类型定义内等)定义宏,除非它只是在该局部范围内使用,否则会损害程序的清晰性。
第十章 c++/c文件结构和程序版式
待续。。。

发布了42 篇原创文章 · 获赞 3 · 访问量 1216

猜你喜欢

转载自blog.csdn.net/qq_40910138/article/details/105166732