《c缺陷和陷阱》(c traps and pitfalls) 读书笔记摘录

1. 返回指向函数的指针这样的函数怎么定义
   
2. 牢记运算符优先级别
    (),[],.,->优先级别高> 单目运算符 > 双目运算符号(算术运算 > 移位运算 > 关系运算 > 逻辑运算 > 三目运算 > 赋值运算 > 逗号运算)

3. C语言允许初始化列表中出现多余的逗号。
    int days[] = { 31, 28, 31, 30, 31, 30,
          31, 31, 30, 31, 30, 31, };
注解:这样设计的目的是方便代码美化工具的方便,如果换一种方式书写就更容易理解了。
int days[] = {
            31, 28, 31, 30, 31, 30,
            31, 31, 30, 31, 30, 31,
};

4. 分隔函数参数的逗号并非逗号运算符。例如f(x,y)则x与y的求值顺序是未定的,但是f((x,y))的顺序是确定的,并且该函数只有一个参数。

5. 一个宏如果不带参数,则只需要使用宏名即可,括号无关紧要

6. assert的定义到底是怎样的,使用中不加分号????
   assert定义中并没有加分号。

7. putc的c函数实现
   

8. 可移植性问题可以参考的书目有:《How to Write Portable Software in C(Prentice-Hall)》

9. 自定义的EOF=-1为什么会在 while((c=getchar())!= EOF){}中比系统的慢(前提是去掉 #include <stdio.h>)???
    因为stdio.h中的getchar()是宏实现的,所以在去掉stdio.h后,c编译器将其认为是函数,函数的调用开销当然比宏定义的开销要大。

10. 一个常见的错误:如果c是一个字符变量,使用(unsigned ) c 就可得到与c等价的无符号整数。但这是会失败的,因为在将字符c转换为无符号整数时,c将首先被转换为int型整数,而此时可能得到非预期的结果。
    正确的方式是使用语句(unsigned char ) c, 因为一个unsigned char类型的字符在转换为无符号整数时无需首先转换为int型整数,而是直接进行

转换。

11. 《C++沉思录》数目,先列在这里了,以后有空看。

12. 不对称边界问题,例如对于有符号数,一般是表示的负数范围比表示的整数范围大1, 鉴于这种结果在处理类似于将负数取反转换成整数时,然后利用相同的代码段对数字进行处理时很有可能因为这个不对称边界而出错,潜在的bug。如果测试人员很有经验可以测试出来,否则,就是未来的一个隐患。

 

你可能感兴趣的:(读书笔记)