天天看點

《C專家程式設計》一導讀

《C專家程式設計》一導讀

c專家程式設計

c代碼。c代碼運作。運作碼運作…請!

——barbara ling

所有的c程式都做同一件事,觀察一個字元,然後啥也不幹。

——peter weinberger

你是否注意到市面上存有大量的c語言程式設計書籍,它們的書名具有一定的啟示性,如:c traps and pitfalls(本書中文版《c陷阱與缺陷》已由人民郵電出版社出版), the c puzzle book, obfuscated c and other mysteries,而其他的程式設計語言好像沒有這類書。這裡有一個很充分的理由!

c語言程式設計是一項技藝,需要多年曆練才能達到較為完善的境界。一個頭腦靈活的人很快就能學會c語言中基礎的東西。但要品味出c語言的細微之處,并通過大量編寫各種不同程式成為c語言專家,則耗時甚巨。打個比方說,這是在巴黎點一杯咖啡與在地鐵裡告訴土生土長的巴黎人該在哪裡下車之間的差别。本書是一本關于ansi c程式設計語言的進階讀本。它适用于已經編寫過c程式的人,以及那些想迅速擷取一些專家觀點和技巧的人。

程式設計專家在多年的實踐中建立了自己的技術工具箱,裡面是形形色色的習慣用法、代碼片段和靈活掌握的技巧。他們站在其他更有經驗的同僚的肩膀上,或是直接領悟他們的代碼,或是在維護其他人的代碼時聆聽他們的教誨,随着時間的推移,逐漸形成了這些東西。另外一種成為c程式設計高手的途徑是自省,在認識錯誤的過程中進步。幾乎每個c語言程式設計新手都曾犯過下面這樣的書寫錯誤:

正确的應該是:

一旦有過這樣的經曆,這種痛苦的錯誤(需要進行比較時誤用了指派符号)一般不會再犯。有些程式員甚至養成了一種習慣,在比較式中先寫常數,如:if(3 == i)。這樣,如果不小心誤用了指派符号,編譯器就會發出“attempted assighnment to literal(試圖向常數指派)”的錯誤資訊。雖然當你比較兩個變量時,這種技巧起不了作用。但是,積少成多,如果你一直留心這些小技巧,遲早會對你有所幫助的。

價值2000萬美元的bug

1993年春天,在sunsoft的作業系統開發小組裡,我們接到了一個“一級優先”的bug報告,是一個關于異步i/o庫的問題。如果這個bug不解決,将會使一樁價值2000萬美元的硬體産品生意告吹,因為對方需要使用這個庫的功能。是以,我們頂着重壓尋找這個bug。經過幾次緊張的調試,問題被圈定在下面這條語句上:

這是個打字錯誤,它的原意是一條指派語句。程式員的手指放在“=”鍵上,不小心多按了一下。這條語句成了将x與2進行比較,比較結果是true或者false,然後丢棄這個比較結果。

c語言的表達能力也實在是強,編譯器對于“求一個表達式的值,但不使用該值”這樣的語句竟然也能接受,并且不發出任何警告,隻是簡單地把傳回結果丢棄。我們不知道是應該為及時找到這個問題的好運氣而慶幸,還是應該為這樣一個常見的打字錯誤可能付出高昂的代價而痛心疾首。有些版本的長整數程式已經能夠檢測到這類問題,但人們很容易忽視這些有用的工具。

本書收集了其他許多有益的故事。它記錄了許多經驗豐富的程式員的智慧,避免讀者再走彎路。當你來到一個看上去很熟的地方,卻發現許多角落依然陌生,本書就像是一個細心的向導,幫助你探索這些角落。本書對一些主要話題如聲明、數組/指針等作了深入的讨論,同時提供了許多提示和記憶方法。本書從頭到尾都采用了ansi c的術語,在必要時我會用日常用語來诠釋。

<a href="https://yq.aliyun.com/articles/92905">第1章 c:穿越時空的迷霧</a>

<a href="https://yq.aliyun.com/articles/92905">1.1 c語言的史前階段</a>

<a href="https://yq.aliyun.com/articles/92907">1.2 c語言的早期體驗</a>

<a href="https://yq.aliyun.com/articles/92910">1.3 标準i/o庫和c預處理器</a>

<a href="https://yq.aliyun.com/articles/92917">1.4 k&amp;r c</a>

<a href="https://yq.aliyun.com/articles/92921">1.5 今日之ansi c</a>

<a href="https://yq.aliyun.com/articles/92926">1.6 它很棒,但它符合标準嗎</a>

<a href="https://yq.aliyun.com/articles/92928">1.7 編譯限制</a>

<a href="https://yq.aliyun.com/articles/92931">1.8 ansi c标準的結構</a>

<a href="https://yq.aliyun.com/articles/92938">1.9 閱讀ansi c标準,尋找樂趣和裨益</a>

<a href="https://yq.aliyun.com/articles/92943">1.10 “安靜的改變”究竟有多少安靜</a>

<a href="https://yq.aliyun.com/articles/92945">1.11 輕松一下——由編譯器定義的pragmas效果</a>

第2章 這不是bug,而是語言特性

第3章 分析c語言的聲明

第4章 令人震驚的事實:數組和指針并不相同

第5章 對連結的思考

第6章 運動的詩章:運作時資料結構

第7章 對記憶體的思考

第8章 為什麼程式員無法厘清萬聖節和聖誕節

第9章 再論數組

第10章 再論指針

第11章 你懂得c,是以c++不在話下

附錄a 程式員工作面試的秘密

附錄b 術語表

繼續閱讀