- 1、本文档共6页,可阅读全部内容。
- 2、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
- 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 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)