正文

C与C++代码精粹笔记一2004-12-24 10:41:00

【评论】 【打印】 【字体: 】 本文链接:http://blog.pfan.cn/book/30.html

分享到:

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语句返回。

阅读(2932) | 评论(0)


版权声明:编程爱好者网站为此博客服务提供商,如本文牵涉到版权问题,编程爱好者网站不承担相关责任,如有版权问题请直接与本文作者联系解决。谢谢!

评论

暂无评论
您需要登录后才能评论,请 登录 或者 注册