个人读《编写高质量代码改善C++程序的150个建议》摘录的重点.doc

个人读《编写高质量代码改善C++程序的150个建议》摘录的重点.doc

  1. 1、本文档共6页,可阅读全部内容。
  2. 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
查看更多
个人读《编写高质量代码改善C程序的150个建议》摘录的重点

个人读《编写高质量代码:改善C++程序的150个建议》摘录的重点 本人主要从事底层驱动的编写,因此主要阅读了《编写高质量代码:改善C++程序的150个建议》其中的C语言的部分,对于自己认为重要的点记录于此(呵呵,其实每点都重要) 不要让main函数写成void main 要想保证程序具有良好的可移植性能,就要标明 main 函数返回 int,而不是 void。强烈建议使用以下形式: int main() { // some processing codes return 0; } 赋值符“=”和运算符“= =”的区别 下面的代码就是一个典型的例子: if(nValue = 0) { // do something if nValue is not zero. } 显然,程序员的本意是要写 if( nValue = = 0 )。不幸的是,上述语句虽未达成程序员的本意,但它却完全是合法的,编译器不会给出任何错误提示。C++ 语句首先会将 nValue 赋值为0,然后再判断 nValue 是否为非零。结果就是 if 条件始终不能被满足,大括号中的代码永远不会被执行。 针对 = 和 == 之间的问题,通过良好的代码习惯可以避免,代码如下所示: if(0 == nValue) { // do something if nValue is not zero. } 其他几对容易弄错的运算符是 (按位与)和 (与) ,以及 |(按位或)和 ||(或) 。对于这两对运算符,能够避免错误的只有细心。 对表达式计算顺序不要想当然 不要过分自信地认为自己已经熟悉了所有运算符的优先级、结合律,多写几个括号确实是个好主意。例如: COLOR rgb = (red16) | (green8) | blue; bool isGradeOne = ((nGrade MASK) == GRADE_ONE); 《The C Programming Lauguage》 (程序员亲切地称此书为“K & R” )中反复强调,函数参数也好,某个操作符中的操作数也罢,表达式求值次序是不一定的,每个特定机器、操作系统、编译器也都不一样。 例如: a = p() + q() * r(); 三个函数 p()、q() 和 r() 可能以 6 种顺序中的任何一种被评估求值。乘法运算符的高优级只能保证 q() 和 r() 的返回值首先相乘,然后再加到 p() 的返回值上。所以,就算加上再的括号依旧不能解决问题。 幸运的是,使用显式的、手工指定的中间变量可以解决这一问题,从而保证固定的子表式评估求值顺序: int para1 = p(); int para2 = q(); a = para1 + para2 * r(); 这样,上述代码就为 p()、q() 和 r() 三个函数指定了唯一的计算顺序:p() → q() → r()。 小心宏 #define 使用中的陷阱 用宏定义表达式时,要使用完备的括号。 错误的定义: #define ADD( a, b ) a + b #define MULTIPLE( a, b ) (a * b) 正确的定义应为: #define ADD( a, b ) ((a)+(b)) #define MULTIPLE( a, b ) ((a)*(b)) 使用宏时,不允许参数发生变化。 #define SQUARE( a ) ((a) * (a)) int Square(int a) { return a*a; } int nValue1 = 10, nValue2 = 10; int nSquare1 = SQUARE(nValue1++); // nSquare1=110, nValue1=12 int nSquare2 = Square(nValue2++);// nSquare2=100, nValue2=11 类似的定义,却产生了不同的结果,究其原因还是宏的字符替换问题。正如上面的示样,两处的 a 都被参数 nValue1++ 替换了,所以 nValue1 自增操作也就被执行了两回。这就是宏在展开时对其参数的多次取值替换所带来的副作用。为了避免出现这样的副作用。最简单有效的方法就是保证宏参数不发生变化,如下所示。 #define SQUARE( a ) ((a) * (a)) int nValue1 = 10; int nSquare1 = SQUARE(nValue1); // nSquare1=100 nValue1++; // nValue1=11 用大括号将宏所定义的多条表达式括起来。 如果宏定义包含多条表达式,一定要用大括号将其括起来。如果没有这个大括号,宏定义的多条表达

文档评论(0)

wuailuo + 关注
实名认证
内容提供者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档