《C Traps and Pitfalls》(C陷阱与缺陷)


作者:Andrew Koenig 

阅读时间:201210

一 

读这本书之前,心里很乱。不知道从何下手学习。读过之后,收获并不是太大。一些细节性的问题很有价值。有些地方没有看懂,就跳过了。水平有限,看不出太多有价值的东西,希望以后有机会再看一遍。多多少少还是要写下点东西,有多少就写多少吧。

说实话,我是看到作者的介绍以后才在莫名的冲动之下,复印这本书的。有点奇怪,哈。可能是急切想看看高手的学习方式吧,在目前的这个状态,或许能给自己一些灵感。

看完前两章,最大的收获是:由于程序员的粗心大意,导致了一些“词不达意”的错误,而且很难发现。

比如:把“==”误写为“=”、忽略了语句末尾的“;”、由于不了解优先级而没有加括号表明优先顺序。这些都是看起来没有大毛病,但是结果偏离轨道,相去甚远。这些bug其实都是“笔下误”,如果细心一些都可以避免。

总结:写程序的时候要知道自己在做什么,语句的书写要按照标准来。即使iffor等所辖范围只有一条语句,也要加上“{}”养成良好的习惯。除非有特殊要求,限制(节省)代码长度,否则不可打破规则。对于优先级无法确定(或不明确)的运算,按照自己的计算目的加括号。

看完这本书,最大的收获还是一些编程思想。

比如:3.6节 边界计算与不对称边界  中提到的避免“栏杆错误”的两个通用原则:

(1)首先考虑最简单情况下的特例,然后将得到的结果外推。

(2)仔细计算边界,绝不掉以轻心。

我觉得这两个原则,在理解程序的时候也非常有用,由点到面的理解,由特殊到一般的解题,总结并归纳。

解决了一个概念性的问题:指针和数组名。

参考链接:http://blog.csdn.net/megaboy/article/details/482782

以前我一认为数组名就是一个指针,因为它的用法和指针十分相似。看完第三章,再加上从网上看到一些资料,先总结如下:

1、数组名是一个地址常量,不是指针。网上有人说,数组名就是一个地址,是数组元素所占空间的首地址。下面我来证明这一点。

#include<stdio.h>
int main(void)
{
int a[10],c;
int *b = &c;
printf("%x\n",a);
printf("%x\n",&a);
printf("%x\n",b);
printf("%x\n",&b);
return 0;
}

这个程序的结果是:

12ff58

12ff58

12ff54

12ff50

也就是说,a == &a ,即,数组名的值和它的地址值是相同的!而作为对比的指针bb != &b,那么这就意味着,数组名是一个地址常量,这句话目前看来是对的。

2、既然数组名是一个地址常量,那么它的值是不能改变的,但是一个非常量指针的值是可以变的。

3、在指针的值不改变的前提下,数组名和与数组名值相同的指针是可以互换使用的。

对于书的后半部分,还有许多不懂的地方,合上书能记得的就这么多了。后面关于宏的部分也能看得懂,这部分加括号也需注意.

书读百遍,其义自现。看来读的还不够。没读出什么门道。

你可能感兴趣的:(编程,c)