《C Traps and Pitfalls》(C陷阱與缺陷)
作者:Andrew Koenig
閱讀時間:2012年10月
一
讀這本書之前,心裡很亂。不知道從何下手學習。讀過之後,收穫並不是太大。一些細節性的問題很有價值。有些地方沒有看懂,就跳過了。水平有限,看不出太多有價值的東西,希望以後有機會再看一遍。多多少少還是要寫下點東西,有多少就寫多少吧。
說實話,我是看到作者的介紹以後才在莫名的衝動之下,影印這本書的。有點奇怪,哈。可能是急切想看看高手的學習方式吧,在目前的這個狀態,或許能給自己一些靈感。
二
看完前兩章,最大的收穫是:由於程式設計師的粗心大意,導致了一些“詞不達意”的錯誤,而且很難發現。
比如:把“==”誤寫為“=”、忽略了語句末尾的“;”、由於不瞭解優先順序而沒有加括號表明優先順序。這些都是看起來沒有大毛病,但是結果偏離軌道,相去甚遠。這些bug其實都是“筆下誤”,如果細心一些都可以避免。
總結:寫程式的時候要知道自己在做什麼,語句的書寫要按照標準來。即使if、for等所轄範圍只有一條語句,也要加上“{}”養成良好的習慣。除非有特殊要求,限制(節省)程式碼長度,否則不可打破規則。對於優先順序無法確定(或不明確)的運算,按照自己的計算目的加括號。
三
看完這本書,最大的收穫還是一些程式設計思想。
比如: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 ,即,陣列名的值和它的地址值是相同的!而作為對比的指標b,b != &b,那麼這就意味著,陣列名是一個地址常量,這句話目前看來是對的。
2、既然陣列名是一個地址常量,那麼它的值是不能改變的,但是一個非常量指標的值是可以變的。
3、在指標的值不改變的前提下,陣列名和與陣列名值相同的指標是可以互換使用的。
對於書的後半部分,還有許多不懂的地方,合上書能記得的就這麼多了。後面關於巨集的部分也能看得懂,這部分加括號也需注意.
書讀百遍,其義自現。看來讀的還不夠。沒讀出什麼門道。
相關文章
- 《C缺陷與陷阱》讀書筆記筆記
- C陷阱與缺陷--讀書筆記筆記
- c陷阱與缺陷_知識點整理
- c語言-記錄閱讀《c缺陷與陷阱》C語言
- C陷阱和缺陷,必須知道的495個C語言問題C語言
- Top Ten Traps in C# for C++ Programmers中文版(下篇) (轉)C#C++
- C/C++ 中的算術及其陷阱C++
- C# 壓縮的缺陷C#
- 程式設計師必知的 Python 陷阱與缺陷列表程式設計師Python
- 《從陷阱中學習C/C++》讀書筆記C++筆記
- 學校C語言教材的缺陷C語言
- C/C++返回內部靜態成員的陷阱薦C++
- VS2005中檢測和更正 C/C++ 程式碼缺陷C++
- C 與 C++C++
- c++隱式型別轉換存在的陷阱C++型別
- c/c++ c語言字元與字串C++C語言字元字串
- c與c++基本常識C++
- c與c++的相互呼叫C++
- c與c++的區別C++
- C# is與asC#
- C#你可能不知道的陷阱, IEnumerable介面C#
- C/C++ 合法整數與字元C++字元
- 【C/C++】c++多程式與hiredis的淺使用C++Redis
- Objective-C 與 C++ 的異同ObjectC++
- Python與C/C++呼叫之ctypesPythonC++
- 關於C與C++的區別C++
- C/C++ 時間轉換與表示C++
- C語言---“C語言 誰與爭鋒?”C語言
- C與C++函式的不同特性C++函式
- methodHandle* method, JavaCallArguments* args, TRAPSJava
- C/C++——C++中new與malloc的10點區別C++
- 淺談 C# Assembly 與 IL (一):C# Assembly 與 ReflectionC#
- C/C++典型漏洞產生原理與DemoC++
- C/C++ 常用加密與解密演算法C++加密解密演算法
- Tcl/Tk 命令與C/C++的整合研究C++
- C與C++中struct使用的區別C++Struct
- C#之Equals與==C#
- 命令列與C++命令列C++