1,标准C允许非void类型指针和void类型指针之间进行直接的相互转换。但在C++中,可以把任何类型的指针直接指派给void类型指针,因为void*是一种通用指针;而不能反过来将void类型指针直接指派给任何非void类型指针,除非强制。
2,不可以直接把基类对象直接转换为派生类对象,无论是直接赋值还是强制转换,因为这是“不自然”的。对于基本类型的强制转换一定要区分值的截断与内存截断的不同。如果你是坚持要使用强制转换,必须同时确保内存访问的安全性和转换结果的安全性。
3,while(getch()!='a'); // 特定终止
4,在&&与||表达式中,如果计算前半部分的值后就能确定表达式的值,则表达式的后半部分不计算。
5,如果两个浮点数之差的绝对值小于或等于某一个可接受的误差(即精度),就认为它们是相等的,否则就是不相等。精度根据具体应用要求而定。因此不要直接用"=="或"!="对两个浮点数进行比较。
EPSILON=1e-6;
if(abs(x-y)<=EPSILON) ... // equal
if(abs(x-y)>EPSILON) ... // not equal
if(abs(x)<=EPSILON) ... // equal 0
if(abs(x)>EPSILON) ... // not equal 0
6, #define NULL ((void *)0)
if(p==NULL) ...
if(p!=NULL) ...
7,在多重嵌套循环中,如果有可能,应当将最长的循环放在最内层,最短的循环放在最外层,这样可以减少CPU跨切循环层的次数,从而优化程序的性能。
for(col=0;col<5;col++){
for(row=0;row<100;row++){
sum+=a[row][col];
}
}
8,如果循环体内存在逻辑判断,并且循环次数很大,宜将逻辑判断移到循环体外面。
for(i=0;i<N;i++){
if(condition)
doSomething();
else
doOtherthing();
}
==>>
if(condition){
for(i=0;i<N;i++)
doSomething();
}else{
for(i=0;i<N;i++)
doOtherthing();
}
9,类中的枚举常量
class A{
...
enum{SIZE1=100,SIZE2=200};
int array1[SIZE1];
int array2[SIZE2];
...
};
枚举常量不会占用对象的存储空间,它们在编译时被全部求值,更何况它定义的是一个匿名枚举类型。枚举常量的缺点是不能表示浮点数和字符串。还可以使用另一种方法来定义类的所有对象都共享的常量,即static const。
10,函数调用中参数传递的本质就是用来初始化形参而不是替换形参。
11, char ch='a';
printf("Address of ch:%p\n",&ch);
12,把任何类型的地址或指针强制转换成void *,就可以输出地址了。
13,标准C把空的参数列表解释为可以接受任何类型和个数的参数;而标准C++则把空的参数列表解释为不可以接受任何参数。
void setValue(int width,int height);
float getValue(void);
14,一般地,输出参数放在前面,输入参数放在后面,并且不要交叉出现。
15,应避免函数有太多的参数,参数个数尽量控制在5个以内。如果参数太多,在使用时容易将参数类型和顺序搞错。此时,可以将这些参数封装为一个对象并采用地址传递或引用传递方式。
16,标准C语言中,凡不加类型说明的函数,一律自动按int类型处理。
17,不要将正常值和错误标志混在一起返回。建议正常值用输出参数获得,而错误标志用return语句返回。
正文
C与C++代码精粹笔记一2004-12-24 10:41:00
【评论】 【打印】 【字体:大 中 小】 本文链接:http://blog.pfan.cn/book/30.html
阅读(2932) | 评论(0)
版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!
评论