当学完了谭浩强的《C语言程序设计》之后,想扩展一下自己的C编程能力,然后去网上搜C进阶书籍之类的关键字,就看到有很多人都推荐这本书《C陷阱与缺陷》,然后我果断的买了一本(当然也下载了电子书)读,现在读完了,想写一个总结。
从整体来说,我从这本书里没有学到很多新的需要注意的东西,这本书里提到的很多缺陷在没读这本书之前就已经知道了。所以感觉收获不大。但是,这本书确实提到了一些C的缺陷,我们无法完全避免的。建议刚刚学习C的朋友可以看一下。
我整理了下面两点内容,是我之前没有注意到的或者觉得应该记下来的,拿出来与大家分享。
1.有符号整数的向右移位运算并不等于除以2的某次幂。如(-1)>>1不等于(-1)/2,前者的数为-1或别的数(本人在fedora18,gcc4.7.2版本下测试过),后者的值为0。
2.除数与余数问题:
假设下列式子成立:
q = a / b;
r = a % b;
且b>0。则a b q r的关系应该是怎样的呢?
1.q * b + r = a;
2.如果改变a的正负号,则q的符号也应该改变,但是不会改变q的绝对值;
3.当b>0时,r>=0且r<b.
如 1 = 3 / 2;
1 = 3 % 2;
满足以上的三个条件。
但是
-1 = 3 / 2;
-1 = 3 % 2;
就不会同时满足上面的三个条件了。
所以,c语言在实现除数余数问题时,一般只满足前两个条件,忽略第三个条件。在设计程序的时候,我们应该避免a的值为负数,或者在定义a为无符号数。