C陷阱與缺陷

出版時(shí)間:2003-12-1  出版社:人民郵電出版社  作者:Andrew Koenig  譯者:高巍  
Tag標(biāo)簽:無  

內(nèi)容概要

作者以自己1985年在Bell實(shí)驗(yàn)室時(shí)發(fā)表的一篇論文為基礎(chǔ),結(jié)合自己的工作經(jīng)驗(yàn)擴(kuò)展成為這本對(duì)C程序員具有珍貴價(jià)值的經(jīng)典著作。寫作本書的出發(fā)點(diǎn)不是要批判C語言,而是要幫助C程序員繞過編程過程中的陷阱和障礙。作者以自己1985年在Bell實(shí)驗(yàn)室時(shí)發(fā)表的一篇論文為基礎(chǔ),結(jié)合自己的工作經(jīng)驗(yàn)擴(kuò)展成為這本對(duì)C程序員具有珍貴價(jià)值的經(jīng)典著作。寫作本書的出發(fā)點(diǎn)不是要批判C語言,而是要幫助C程序員繞過編程過程

書籍目錄

第零章 導(dǎo)讀
第一章 詞法“陷阱”
第二章 語法“陷阱”
第三章 語義“陷阱”
第四章 連接
第五章 庫函數(shù)
第六章 預(yù)處理器
第七章 可移植性缺陷
第八章 建議與答案

圖書封面

圖書標(biāo)簽Tags

評(píng)論、評(píng)分、閱讀與下載


    C陷阱與缺陷 PDF格式下載


用戶評(píng)論 (總計(jì)32條)

 
 

  •     這本書的主題是C中的各類細(xì)節(jié),平時(shí)往往不會(huì)注意。
      
      1.注釋的嵌套性,怎么判斷編譯器是否允許嵌套注釋。
      2.運(yùn)算符優(yōu)先級(jí),結(jié)合順序,編譯器貪婪
      3.assert的實(shí)現(xiàn)方法,避免if
      4.少敲一個(gè)分號(hào)導(dǎo)致各種血案
      5.注意函數(shù)、if等的作用域。
      6.注意字符集,防止移植性問題
      7.變長參數(shù),stdargs
  •     這是一本需要放在案頭時(shí)時(shí)翻閱的書,甚至如果不顯得過分的話,每次寫C代碼之前都應(yīng)該翻閱一下目錄,回憶一下大致的內(nèi)容。
      
      這本書從詞法、語法、語義、鏈接(中文版譯為“連接”,但據(jù)我所讀過的相關(guān)書籍,全部譯的是“鏈接”)、庫、預(yù)處理器、可移植性等層次和方面介紹了C語言編程中可能遇到的問題。
      
      其中涉及到一些ANSI C之前的內(nèi)容,這對(duì)于一些讀者(包括我)可能來說是比較陌生的,如果有志于維護(hù)使用K&R C編寫的古董程序或者想寫出幾乎所有C編譯器都能搞定的代碼的,可以細(xì)細(xì)琢磨琢磨,其他人亦可以借此訓(xùn)練訓(xùn)練思維,或者說測(cè)試測(cè)試自己的功底。
      
      這本書里還有一些部分非常底層,會(huì)涉及到大端法、小端法的問題,也會(huì)涉及到數(shù)據(jù)的位模式的問題。這個(gè)是需要一定的基礎(chǔ)的,我這方面的知識(shí)應(yīng)該是來源于CSAPP(不好意思,不算植入廣告吧)的。
      
      對(duì)于其中記錄的缺陷和陷阱,切不可走馬觀花。我覺得讀書、尤其是這類總結(jié)了前人犯過的錯(cuò)誤和經(jīng)驗(yàn)的書籍,必須有三問:一問原來為何出錯(cuò),二問解決辦法為何正確,三問如何避免出錯(cuò)。一般的書籍都解釋了原來為何出錯(cuò),那么讀者就應(yīng)該想想如何才能發(fā)現(xiàn)這類錯(cuò)誤。
      
      關(guān)于思考如何避免出錯(cuò),我舉兩個(gè)例子:
      
      一個(gè)是此書2.6節(jié)講到了“懸掛”else引發(fā)的種種問題,如果大家寫的代碼足夠多并且以多寫一對(duì)花括號(hào)為恥的話,肯定已經(jīng)遇到了這個(gè)問題。如果其中涉及到宏,則問題隱藏得會(huì)更深。那么如何避免出錯(cuò)呢?首先,前面提到宏會(huì)使問題得到隱藏,那么”小心、謹(jǐn)慎“這種說法是絕對(duì)行不通的,甚至使用一些自動(dòng)indent的工具也不能發(fā)現(xiàn)問題。那么我們就應(yīng)該想其他的辦法。而我能想到的就是所有的if從句和else從句都用花括號(hào)包圍起來。這當(dāng)然得先樹立正確的榮辱觀,即不以多寫了“沒必要”的花括號(hào)為恥。
      
      二是練習(xí)1-2中隱含的一個(gè)問題:既然編譯器不支持嵌套注釋,那如果我在注釋代碼的時(shí)候,這段代碼中有注釋呢?難道編譯器報(bào)錯(cuò)之后我就把代碼段中的注釋去掉?那我如果只是臨時(shí)注釋掉以供調(diào)試或其他用途,不久還會(huì)使用呢?根據(jù)《代碼大全》第二版(這個(gè)也不是廣告),我們可以利用預(yù)處理器來解決這個(gè)問題:
      #if 0
       /* statements to comment out */
      #endif
      
      以上便是我的一點(diǎn)讀書感受和方法論。
  •     書中的內(nèi)容感覺有一部分還是比較不錯(cuò)的,我覺得我如果碰到了那些問題,肯定栽了。但是這個(gè)書中的有些內(nèi)容確實(shí)該去掉的,因?yàn)镃標(biāo)準(zhǔn)都出了很多年了。
      但是感覺書的內(nèi)容并不怎么配得上各種超高評(píng)價(jià)。
      或許是我的C語言水平比較差吧。
      不過這本書還是值得多讀幾遍的。
      
  •     這本書中介紹的絕大部分內(nèi)容都偏舊了,或者說對(duì)于我這樣的編碼1年以上的人來說,有點(diǎn)過時(shí)了,跟準(zhǔn)確的說,書中介紹的東西,我基本上都知道了。不過該書很適合剛學(xué)習(xí)C語言的新手看看,對(duì)于新手了解使用C語言過程中可能存在的“陷阱”很有幫助。
      
      一本書總是或多或少地帶給自己以前不知道的一些東東,詳細(xì)的這些,我都寫在了blog中,地址是http://www.cnblogs.com/cnpirate/,呵呵
  •     花了兩天時(shí)間翻完一遍。
      對(duì)一個(gè)栗子印象深刻:
      “0123456789”[n] 居然也是一個(gè)合法的數(shù)組形式。 -_-!?。?br />   printf("%c", “0123456789”[0])將打印字符‘0’
      依次類推,printf("%c", “0123456789”[1])將打印字符‘1’,printf("%c", “0123456789”[2])將打印字符‘2’……
      用于解決某些機(jī)器的字符集中數(shù)字不是順序排列的問題。
      (《K&R》也有提到某些架構(gòu)的機(jī)器上不宜用c+‘0'這樣方法來求c的數(shù)字表示,具體哪些變態(tài)的機(jī)器會(huì)采取這種策略就不得而知了)
      因?yàn)橐粋€(gè)字符串常量可以用來表示一個(gè)字符數(shù)組,所以在數(shù)組名出現(xiàn)的地方都可以用字符串常量來替換。
  •     前天晚上才拿到這本書,很薄的一本,但是人郵的書就是貴
      
      昨天上午看了兩章,晚上看了第三章,今天上午把剩下的看完
      
      唯一的感覺就是很爽,這本書寫的東西大多數(shù)都知道,但也有第一次看到的,比如 i[arr] 等價(jià)于 arr[i],從指針的角度來解釋一目了然,但是過去自己從未想到過這個(gè)問題,也沒有試驗(yàn)過
      
      寫程序最重要的是思考和總結(jié),而不是寫的多少,寫的再多只不過是垃圾代碼
      
      本書最后一章介紹的可移植性,妙哉!考慮邊界情況,無符號(hào)整數(shù)與有符號(hào)整數(shù)的區(qū)別,從 C 的角度思考問題,就值得研讀的就是 Computer Systems
      
      曾讀過 Andrew Koenig 的 Accelerated C++、C++ 沉思錄,可能是由于翻譯的緣故,唯這本書讀的最為順暢
  •     作者選材很好,文字也很簡潔。不過可惜書的內(nèi)容有老。里面的C不知道是哪個(gè)版本跟目前學(xué)的的TC3.0或者VC6.0不太一樣
  •     成名作啊,的確不錯(cuò)的書
      
      不過由于之前Expert C Programming看的太認(rèn)真,看C Traps and Piffalls會(huì)快很多
      
      CTP這本書算是作者自己在編程過程中的一些notes吧,其實(shí)也就是偶們自己寫C的時(shí)候很容易犯的一些錯(cuò)誤~
  •      剛看完這本書,此書所稱歸納了C語言中最晦暗不明的部分,回憶起來幾乎都我之前的編程中全部都出現(xiàn)過,如復(fù)雜聲明、野指針、邊界差一錯(cuò)誤、鏈接器問題、宏定義、移植性問題等。但這些問題在一般的C語言指導(dǎo)書籍上都是很少提到和解釋的。當(dāng)時(shí)只得在網(wǎng)上去尋求答案。如果之前看了這本書,相信可以節(jié)約一些時(shí)間,對(duì)于問題的根源也會(huì)了解得更加系統(tǒng)。
       這本的歷史其實(shí)蠻久的,部分篇章在ANSI C之前就存在了,因此對(duì)于一些ANSI C之前的細(xì)節(jié)也進(jìn)行了探討。經(jīng)常從底層和編譯器的角度進(jìn)行了問題的闡述,讓我了解這些問題為何會(huì)出現(xiàn),以及出現(xiàn)的緣由。
       作者的另外一本書《Accerlerated C++ 》也很好,抓緊看完再寫書評(píng)......
  •     一個(gè)下午剛剛看完老羅的《我的奮斗》坐在電腦前和女朋友說著要看書,否則會(huì)被她嘲笑書架上那2/3的書還沒看完,又買了好多。
      
      于是8點(diǎn)半左右的時(shí)候,站在書架前挑選了這本比較薄的先來欺負(fù)。
      
      雖然之前電子版也已經(jīng)看了10來頁,但是這次還是從序言開始看起,還對(duì)序言里面不懂的單詞 對(duì)照著后面的翻譯去猜測(cè)。
      
      認(rèn)認(rèn)真真的從第一章看到第七章,從企圖到網(wǎng)上尋找習(xí)題答案到突然想起來找找書中是否已經(jīng)有答案,從20:30 看到00:30 ,真的可以說是一氣呵成。
      
      從大學(xué)畢業(yè)以后很多年都沒有在撿起C相關(guān)的東西,買這本書的動(dòng)機(jī),多少是想了解如何預(yù)防一些普遍存在的陷阱。不過這么一遍閱讀下來,目的性的收獲不多,畢竟,好多都是c特有的陷阱,當(dāng)然對(duì)c++ 也有些醒世的作用,對(duì)于其他就不適用了。
      
      標(biāo)榜著非初級(jí)的讀物,其實(shí)還是相當(dāng)淺顯易懂的,當(dāng)然前提是當(dāng)年那些概念就已經(jīng)非常清楚。淺顯不代表沒有拍案叫絕的沖動(dòng)。那些陷阱被揭穿的時(shí)候一樣會(huì)恍然大悟。只是慶幸的,如果自己做,已經(jīng)從所謂coding style上面杜絕了大多數(shù)陷阱的發(fā)生。
      
      另外一個(gè)巨大的收獲卻不在陷阱本身,而是c語言的實(shí)現(xiàn)。一方面是第一次意識(shí)到以前調(diào)用的“函數(shù)”其實(shí)卻是宏定義,另外一方面,幾乎每一章在閱讀時(shí)都以編譯原理的角度來思考問題的根源,會(huì)考慮如果自己來設(shè)計(jì)這種語言怎么辦——其實(shí)這也是不少習(xí)題試圖引導(dǎo)讀者思考的方向。
      
      
  •     這本書是我的第二本C語言書,大學(xué)學(xué)的譚老的書不算。
      
      也許是《C語言程序設(shè)計(jì)現(xiàn)代方法》一書過于詳盡的原因,而且畢竟也有著一些編程基礎(chǔ),在讀這本書的時(shí)候我讀的很快。
      
      這不是講C語言基礎(chǔ)的書,而是從一些C語言的特性入手,講C語言編程時(shí)容易出現(xiàn)的錯(cuò)誤,以及一些最佳實(shí)踐。
      
      雖然對(duì)我的幫助不是特別大,但是我還是推薦初學(xué)者把這本書作為學(xué)習(xí)C語言的第二本書!
  •      書中講的全是使用C語言中容易忽視的問題,可是我記得書中好象沒有談及 char **p 和 const char **p 不兼容,但 char *p 和 const char *p卻是兼容的問題…… 微失望……
  •     很好的書,不是初級(jí)讀物,但也不過于艱深,而且厚度剛剛好,讓人在熱情高漲階段讀完,不致于到了一半時(shí)間就氣餒。
      
      但令人感到遺憾的是,排版是太差了!代碼縮進(jìn)極其混亂,許多代碼看上去參差不齊,該對(duì)齊的地方?jīng)]對(duì)齊,對(duì)齊的長短不一,不該換行的地方換行,這種情況比比皆是,版能排成這個(gè)樣子,顯得極其草率。
      
      編者為什么不去隨便找一本外版計(jì)算機(jī)書看一看(這本書本來就是翻譯的),隨便哪個(gè)出版社,O'REILLY, PRENTICE HALL, Addison Wesley, 看看人家的代碼是怎樣排的,只需要看一看,比較一下,馬上就能發(fā)現(xiàn)問題,為什么不肯這么做呢?
      
  •     這個(gè)可是Andrew Koenig同志揚(yáng)名已久的一本書.可真的是揚(yáng)名太久了,這本書居然是出版在ANSI C制訂以前,真是汗阿.以至于書中居然還在考慮如何兼容K&R風(fēng)格的函數(shù)定義形式.
      這本書倒真的是一些很瑣碎的事情,比如說dangling else,switch中漏掉的break.
      收獲還是一些.
      最明顯的是,我發(fā)現(xiàn)其實(shí)運(yùn)算符的優(yōu)先級(jí)也不是那么麻煩,花點(diǎn)心思記下來其實(shí)也挺好的:)
      
  •   感覺這本書不在看多塊,得多翻翻。最有意思的應(yīng)該是些小細(xì)節(jié)
  •   嗯,我貌似做了蠻多筆記,包括orz醬紫的符號(hào)- -||。但是,亮點(diǎn)是,這本書是我從圖書館借的……
  •   我在圖書館看書時(shí)候都帶一把尺子orz...
  •   尺子?干嘛用的?
  •   劃線 ><
  •   這本適合入門的看么?
  •   如果什么都不懂就不適合了,因?yàn)檫@本書講的是最佳實(shí)踐
  •   有一定的基礎(chǔ), 開始做編程的應(yīng)該挺適合閱讀這本。
  •   那還是覺得適合這個(gè):C語言程序設(shè)計(jì)現(xiàn)代方法
  •   c專家編程里有講...
  •   他那個(gè)年代,C里面還沒有const
  •   這書要是影印就好了
  •   這個(gè)排版確實(shí)很惡心人。。。
  •   呵呵,K&R 兩個(gè)版本都是在 ANSI C 正式出來之前出版的。
  •   呵呵,是啊.
    那兩個(gè)牛牛,又是誰能與其相提并論的呢:)
  •   woo,你在都江堰還好?
  •   昏..K&R的第二版是在ANSI C之后出版的啦..
  •   編程就好比練功,如果學(xué)習(xí).net,mfc,vb等具體的語言和工具是外功(招式),對(duì)基礎(chǔ)的學(xué)習(xí)就是內(nèi)功,只注重招式而內(nèi)功不扎實(shí)是不可能成為高手的。很多人會(huì)認(rèn)為《射雕英雄傳》中馬玉道長什么都沒有教郭靖,馬道長教的表面看來是馬步?jīng)_權(quán)實(shí)則都是內(nèi)功心法,郭靖拜師洪七之后開始練習(xí)降龍十八掌憑借的就是這深厚的內(nèi)功,吞食蝮蛇寶血又加上練習(xí)了周博通傳授的九陰真經(jīng)和外加功夫雙手互博技之后,終于練就行走江湖的武功,由此可見馬玉道長傳授給了郭靖的是最基礎(chǔ)的,也是最重要的觀念,編程也好比蓋高樓,根基沒打好早晚有一天會(huì)挎掉的,而且蓋得越高,損失也越慘重。這些底層知識(shí)和課本不是沒有用也不是高深的不能學(xué),而是我們必須掌握的基礎(chǔ)。
    閱讀經(jīng)典的書籍就是幫助我們打好基礎(chǔ)的最好方法,毫無疑問本書就是這樣的經(jīng)典書籍。本書分章討論社區(qū):http://bbs.theithome.com/,來享受經(jīng)典的魅力吧?。?/li>
 

250萬本中文圖書簡介、評(píng)論、評(píng)分,PDF格式免費(fèi)下載。 第一圖書網(wǎng) 手機(jī)版

京ICP備13047387號(hào)-7