官术网_书友最值得收藏!

前        言

對(duì)于經(jīng)驗(yàn)豐富的行家而言,得心應(yīng)手的工具在初學(xué)時(shí)的困難程度往往要超過(guò)那些容易上手的工具。剛剛接觸飛機(jī)駕駛的學(xué)員,初航時(shí)總是謹(jǐn)小慎微,只敢沿著海岸線來(lái)回飛行,等他們稍有經(jīng)驗(yàn),就會(huì)明白這樣的飛行其實(shí)是一件多么輕松的事。初學(xué)騎自行車的新手,可能覺(jué)得后輪兩側(cè)的輔助輪很有幫助,一旦熟練了,就會(huì)發(fā)現(xiàn)它們很是礙手礙腳。

這種情況對(duì)程序設(shè)計(jì)語(yǔ)言也是一樣。任何一種程序設(shè)計(jì)語(yǔ)言,總存在一些語(yǔ)言特性,很可能會(huì)給還沒(méi)有完全熟悉它們的人帶來(lái)麻煩。令人吃驚的是,這些特性雖然因程序設(shè)計(jì)語(yǔ)言的不同而異,但對(duì)于特定的一種語(yǔ)言,幾乎每個(gè)程序員都在同樣的一些特性上犯過(guò)錯(cuò)誤,吃過(guò)苦頭!因此,我也就萌生了將這些程序員易犯錯(cuò)誤的特性加以收集、整理的最初念頭。

我第一次嘗試收集這類問(wèn)題是在1977年。當(dāng)時(shí),在華盛頓特區(qū)舉行的一次SHARE(IBM 大型機(jī)用戶組)會(huì)議上,我做了一次題為“PL/I中的問(wèn)題與‘陷阱’”的發(fā)言。做此發(fā)言時(shí),我剛從哥倫比亞大學(xué)調(diào)至AT&T的貝爾實(shí)驗(yàn)室。在哥倫比亞大學(xué)我們主要的開(kāi)發(fā)語(yǔ)言是PL/I,而貝爾實(shí)驗(yàn)室中主要的開(kāi)發(fā)語(yǔ)言卻是C。在貝爾實(shí)驗(yàn)室工作的10年間,我積累了豐富的經(jīng)驗(yàn),深諳C程序員(也包括我本人)在開(kāi)發(fā)時(shí)如果一知半解將會(huì)遇到多少麻煩。

1985年,我開(kāi)始收集有關(guān)C語(yǔ)言的此類問(wèn)題,并在年底將結(jié)果整理后作為一篇內(nèi)部論文發(fā)表。這篇論文所引發(fā)的回應(yīng)大大出乎我的意料,共有2000多人向貝爾實(shí)驗(yàn)室的圖書館索取該論文的副本!我由此確信,有必要進(jìn)一步擴(kuò)充該論文的內(nèi)容,于是就寫成了現(xiàn)在讀者所看到的這本書。

本書是什么

本書力圖通過(guò)揭示一般程序員甚至是經(jīng)驗(yàn)老道的職業(yè)程序員如何在編程中犯錯(cuò)誤、摔跟頭,以提倡和鼓勵(lì)預(yù)防性的程序設(shè)計(jì)。這些錯(cuò)誤實(shí)際上一旦被程序員真正認(rèn)識(shí)和理解,并不難避免。因此,本書闡述的重點(diǎn)不是一般原則,而是一個(gè)個(gè)具體的例子。

如果你是一個(gè)程序員并且開(kāi)發(fā)中真正用到C語(yǔ)言來(lái)解決復(fù)雜問(wèn)題,本書應(yīng)該成為你的案頭必備圖書。即使你已經(jīng)是一個(gè)專家級(jí)的C語(yǔ)言程序員,仍然有必要擁有這本書,很多讀過(guò)本書早期手稿的專業(yè)C程序員常常感嘆:“就在上星期我還遇到這樣一個(gè)Bug!”如果你正在教授C語(yǔ)言課程,本書毫無(wú)疑問(wèn)應(yīng)該成為你向?qū)W生推薦的首選補(bǔ)充閱讀材料。

本書不是什么

本書不是對(duì)C語(yǔ)言的批評(píng)。程序員無(wú)論使用何種程序設(shè)計(jì)語(yǔ)言,都有可能遇到麻煩。本書濃縮了作者長(zhǎng)達(dá)10年的C語(yǔ)言開(kāi)發(fā)經(jīng)驗(yàn),集中闡述了C語(yǔ)言中各種問(wèn)題和“陷阱”,目的是希望程序員讀者能夠從中吸取我本人以及我所見(jiàn)過(guò)的其他人所犯錯(cuò)誤的經(jīng)驗(yàn)教訓(xùn)。

本書不是一本“烹飪菜譜”。我們無(wú)法通過(guò)詳盡的指導(dǎo)說(shuō)明來(lái)完全避免錯(cuò)誤。如果可行的話,那么所有的交通事故都可以通過(guò)在路旁刷上“小心駕駛”的標(biāo)語(yǔ)來(lái)杜絕。對(duì)一般人而言,最有效的學(xué)習(xí)方式是從感性的、活生生的事例中學(xué)習(xí),比如自己的親身經(jīng)歷或者他人的經(jīng)驗(yàn)教訓(xùn)。而且,哪怕只是明白了一種特定的錯(cuò)誤是如何發(fā)生的,就已經(jīng)在將來(lái)避免該錯(cuò)誤的路上邁了一大步。

本書并不打算教你如何用C語(yǔ)言編程 (可見(jiàn)Kernighan和Ritchie:The C Programming Language,第2版,Prentice-Hall,1988),也不是一本C語(yǔ)言參考手冊(cè)(可見(jiàn)Harbison和Steele:C:A Reference Manual,第2版,Prentice-Hall,1987)。本書未提及數(shù)據(jù)結(jié)構(gòu)與算法(可見(jiàn)Van Wyk:Data Structures And C Programs,Addison-Wesley,1988),僅僅簡(jiǎn)略介紹了可移植性(可見(jiàn)Horton:How To Write Portable Programs In C,Prentice-Hall,1989)和操作系統(tǒng)接口(可見(jiàn)Kernighan和Pike:The Unix Programming Environment,Prentice-Hall,1984)。本書所涉及的問(wèn)題均來(lái)自編程實(shí)踐,并適當(dāng)作了簡(jiǎn)化(如果希望讀到一些“挖空心思”設(shè)計(jì)出來(lái),專門讓你絞盡腦汁的C語(yǔ)言難題,可見(jiàn)Feuer:The C Puzzle Book,Prentice-Hall,1982)。本書既不是一本字典,也不是一本百科全書,我力圖使其精簡(jiǎn)短小,以鼓勵(lì)讀者能夠閱讀全書。

讀者的參與和貢獻(xiàn)

可以肯定,我遺漏了某些值得注意的問(wèn)題。如果你發(fā)現(xiàn)了一個(gè)C語(yǔ)言問(wèn)題而本書又未提及,請(qǐng)通過(guò)Addison-Wesley出版社與我聯(lián)系。在本書的下一版中,我很有可能引用你的發(fā)現(xiàn),并且向你致謝。

關(guān)于ANSI C

在寫作本書時(shí),ANSI C標(biāo)準(zhǔn)尚未最后定案。嚴(yán)格地說(shuō),在ANSI委員會(huì)完成其工作之前,“ANSI C”的提法從技術(shù)上而言是不正確的。而實(shí)際上,ANSI標(biāo)準(zhǔn)化工作大體已經(jīng)塵埃落定,本書提及的有關(guān)ANSI C標(biāo)準(zhǔn)內(nèi)容基本上不可能有所變動(dòng)。很多C編譯器甚至已經(jīng)實(shí)現(xiàn)了ANSI委員會(huì)所考慮的對(duì)C語(yǔ)言的大部分重大改進(jìn)。

無(wú)須擔(dān)心你使用的C編譯器不支持書中出現(xiàn)的ANSI標(biāo)準(zhǔn)函數(shù)語(yǔ)法,它并不會(huì)妨礙你理解例子中真正重要的內(nèi)容,而且書中提及的程序員易犯錯(cuò)誤其實(shí)與何種版本的C編譯器并無(wú)太大關(guān)系。

致謝

本書中問(wèn)題的收集整理工作絕非一人之力可以完成。以下諸位都向我指出過(guò)C語(yǔ)言中的特定問(wèn)題,他們是Steve Bellovin(6.3節(jié))、Mark Brader(1.1節(jié))、Luca Cardelli(4.4節(jié))、Larry Cipriani(2.3節(jié))、Guy Harris和Steve Johnson(2.2節(jié))、Phil Karn(2.2節(jié))、Dave Kristol(7.5節(jié))、George W. Leach(1.1節(jié))、Doug McIlroy(2.3節(jié))、Barbara Moo(7.2節(jié))、Rob Pike(1.1節(jié))、Jim Reeds(3.6節(jié))、Dennis Ritchie(2.2節(jié))、Janet Sirkis(5.2節(jié))、Richard Stevens(2.5節(jié))、Bjarne Stroustrup(2.3節(jié))、Ephraim Vishnaic(1.4節(jié)),以及一位自愿要求隱去姓名的人(2.3節(jié))。為簡(jiǎn)短起見(jiàn),對(duì)于同一個(gè)問(wèn)題此處僅僅列出了第一位向我指出該問(wèn)題的人。我認(rèn)為這些錯(cuò)誤絕不是憑空臆造出來(lái)的,而且即使是,我想也沒(méi)有人愿意承認(rèn)。至少這些錯(cuò)誤我本人幾乎都犯過(guò),而且有的還不止犯過(guò)一次。

在書稿編輯方面許多有用的建議來(lái)自Steve Bellovin、Jim Coplien、Marc Donner、Jon Forrest、Brian Kernighan、Doug McIlroy、Barbara Moo、Rob Murray、Bob Richton、Dennis Ritchie、Jonathan Shapiro,以及一些未透露姓名的審閱人員。Lee McMahon與Ed Sitar為我指出了早期手稿中的許多錄入錯(cuò)誤,使我避免了一旦成書后將要遇到的很多尷尬。Dave Prosser為我指明了許多ANSI C中的細(xì)微之處。Brian Kernighan提供了極有價(jià)值的排版工具和幫助。

與Addison-Wesley出版社合作是一件愉快的事情,感謝Jim DeWolf、Mary Dyer、Lorraine Ferrier、Katherine Harutunian、Marshall Henrichs、Debbie Lafferty、Keith Wollman和Helen Wythe。當(dāng)然,他們也從一些并不為我所知的人那里得到了幫助,使本書最終得以出版,在此一并致謝。

我需要特別感謝AT&T貝爾實(shí)驗(yàn)室的管理層,包括Steve Chappell、Bob Factor、Wayne Hunt、Rob Murray、Will Smith、Dan Stanzione和Eric Sumner,他們開(kāi)明的態(tài)度和支持使我得以寫作本書。

本書書名受到Robert Sheckley的科幻小說(shuō)選集的啟發(fā),其書名是The People Trap and Other PitfallsSnaresDevices and Delusionsas well as Two Sniggles and a Contrivance)(1968年由Dell Books出版)。

主站蜘蛛池模板: 隆尧县| 精河县| 无极县| 前郭尔| 孟连| 丰台区| 崇明县| 常州市| 盱眙县| 金寨县| 乡宁县| 宁安市| 黎城县| 太白县| 桂阳县| 磐安县| 浪卡子县| 宜宾市| 峡江县| 绵竹市| 建阳市| 黄大仙区| 绥江县| 虹口区| 罗平县| 东明县| 岫岩| 东乡县| 图木舒克市| 娄底市| 北流市| 舒兰市| 高要市| 蒲江县| 沂水县| 竹溪县| 清新县| 乌什县| 阿拉善左旗| 融水| 陈巴尔虎旗|