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

kehr發表於2012-10-02


作者: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、在指標的值不改變的前提下,陣列名和與陣列名值相同的指標是可以互換使用的。

對於書的後半部分,還有許多不懂的地方,合上書能記得的就這麼多了。後面關於巨集的部分也能看得懂,這部分加括號也需注意.

書讀百遍,其義自現。看來讀的還不夠。沒讀出什麼門道。

相關文章