回首頁  
帳號
 
關於博碩 博碩好讀 校園圖書 MOCC認證 下載教學 博碩教育雲 數位學院 最新書單(歡迎下載)

博碩好讀
  新書推薦
  出版預告
  名家名著
 

分類索引

 

出版總覽

 

讀者服務

  徵求作者
 
首頁 >> 書籍介紹
 
 
點我可放大圖片
 
書名:C Traps and Pitfalls中文版
書號:MP11912 作者:Andrew Koenig ISBN: 978-986-434-452-9
定價:NT$380元 印刷:單色 頁數:208頁
書籍規格:17*23 上市日:2019/12/8 譯者:高巍 譯、王昕、博碩文化 審校
學習定位:無 本書附件:無  
前往購買 >> 天瓏 類別:電腦技術  
       
快速前往 快速前往        

 

 
    C語言大師經典名作至今仍然歷久不衰
    幫助你避開編寫C語言時各種意外陷阱
    無論是新手老手高手都應該要案頭備存

    作者以自己1985年在Bell實驗室時發表的一篇論文為基礎,結合自己的工作經驗,進而成為這本對C語言程式設計師具有珍貴價值的經典著作。寫作本書的出發點並不是要批判C語言,而是要幫助C語言程式設計師繞過編寫過程中的陷阱和障礙。

    全書分為8章,分別從詞法分析、語法語義、連接、庫函數、預處理器、可移植性缺陷等幾個方面,分析了在C語言編寫中可能遇到的問題。最後,作者用一章的篇幅提供了若干具有實用價值的建議。

    本書適合有一定經驗的C語言程式設計師閱讀學習,即便你是C語言編寫高手,本書也應該成為你案頭上的必備書籍。



    ----節錄內容----
    詞法分析中的「貪心法」
    C 語言的某些符號,例如/ 、* 、和=,只有一個字元長,稱為單字元符號。而 C 語言中的其他符號,例如/* 和 = = ,以及識別子,包括了多個字元,稱為多字元符號。當 C 編譯器讀入一個字元'/' 後又跟了一個字元'*',那麼編譯器就必須做出判斷:是將其作為兩個分別的符號,還是合起來作為一個符號對待。C 語言對這個問題的解決方案可以歸納為一個很簡單的規則:每一個符號應該包含盡可能多的字元。也就是說,編譯器將程式分解成符號的方法是,從左到右一個字元一個字元地讀入,如果該字元可能組成一個符號,那麼再讀入下一個字元,判斷已經讀入的兩個字元組成的字串是否可能是一個符號的組成部分;如果可能,繼續讀入下一個字元,重覆上述判斷,直到讀入的字元組成的字串已不再可能組成一個有意義的符號。這個處理策略有時被稱為「貪心法」,或者,更口語化一點,稱為「大嘴法」。Kernighan 與Ritchie 對這個方法的描述如下,「如果(編譯器的)輸入流截止至某個字元之前,都已經被分解為一個個符號,那麼下一個符號將包括從該字元之後可能組成一個符號的最長字串。」

    需要注意的是,除了字串與字元常數,符號的中間不能嵌有空白(空白字元、Tab 和換行字元)。例如,== 是單一符號,而= = 則是兩個符號,下面的表達式

       a---b


    與表達式

       a -- - b


    的涵義相同,而與

       a - -- b


    的涵義不同。同樣地,如果/是為判斷下一個符號而讀入的第一個字元,而/之後緊接著*,那麼無論上下文如何,這兩個字元都將被當作一個符號/*,表示一段註解的開始。

    根據程式碼中註解的意思,下面的語句的本意似乎是用x除以p所指向的值,把所得的商再賦給y:

       y = x/*p /* p指向除數 */;


    而實際上,/*被編譯器理解為一段註解的開始,編譯器將不斷地讀入字元,直到*/出現為止。也就是說,該語句直接將x的值賦給y,根本不會顧及到後面出現的p。將上面的語句重寫如下:

       y = x / *p /* p指向除數 */;


    或者更加清楚一點,寫作:

       y = x/(*p) /* p指向除數 */;


    這樣得到的實際效果才是語句註解所表示的原意。

    諸如此類的準二義性(near-ambiguity)問題,在有的上下文環境中還有可能招致麻煩。例如,老版本的 C 語言中允許使用 =+來 代表現在 += 的涵義。這種老版本的 C 編譯器會將

       a=-1;


    理解為下面的語句

       a =- 1;


    亦即

       a = a - 1;


    因此,如果程式設計師的原意是

       a = -1;


    那麼所得結果將使其大吃一驚。

    另一方面,儘管/* 看上去像一段註解的開始,在下例中這種老版本的編譯器會將

       a=/*b;


    當作

       a =/ *b ;


    這種老版本的編譯器還會將複合賦值視為兩個符號,因此可以毫無疑問地處理

       a >> = 1;


    而一個嚴格的 ANSI C 編譯器則會報錯。
 
    CHAPTER 00 導讀

    CHAPTER 01 詞法陷阱
    1.1 = 不同於==
    1.2 & 和 | 不同於 && 和 ||
    1.3 詞法分析中的「貪心法」
    1.4 整數型常數
    1.5 字元與字串

    CHAPTER 02 語法陷阱
    2.1 理解函數宣告
    2.2 運算子的優先級問題
    2.3 注意作為語句結束標誌的分號
    2.4 switch 語句
    2.5 函數呼叫
    2.6 「懸掛」else 引發的問題

    CHAPTER 03 語義陷阱
    3.1 指標與陣列
    3.2 非陣列的指標
    3.3 作為參數的陣列宣告
    3.4 避免「舉隅法」
    3.5 空指標並非空字串
    3.6 邊界計算與不對稱邊界
    3.7 求值順序
    3.8 運算子&&、|| 和 !
    3.9 整數溢出
    3.10 為函數main提供返回值

    CHAPTER 04 連結
    4.1 什麼是連結器
    4.2 宣告與定義
    4.3 命名衝突與static修飾子
    4.4 形式參數、實際參數與返回值
    4.5 檢查外部類型
    4.6 標頭檔

    CHAPTER 05 庫函數
    5.1 返回整數的getchar函數
    5.2 更新順序檔案
    5.3 緩衝輸出與記憶體分配
    5.4 使用 errno 檢測錯誤
    5.5 庫函數 signal

    CHAPTER 06 預處理器
    6.1 不能忽視巨集定義中的空格
    6.2 巨集並不是函數
    6.3 巨集並不是語句
    6.4 巨集並不是類型定義

    CHAPTER 07 可移植性缺陷
    7.1 應對 C 語言標準變更
    7.2 識別子名稱的限制
    7.3 整數的大小
    7.4 字元是有符號整數還是無符號整數
    7.5 移位運算子
    7.6 記憶體位置
    7.7 除法運算時發生的截斷
    7.8 亂數的大小
    7.9 大小寫轉換
    7.10 首先釋放,然後重新分配
    7.11 可移植性問題的一個例子

    CHAPTER 8 建議與答案
    8.1 建議
    8.2 答案

    附錄A
    附錄B
 
    Andrew Koenig

    AT&T大規模程式研發部(前貝爾實驗室)成員。他從1986年開始從事C語言的研究,1977年加入貝爾實驗室。他編寫了一些早期的類別庫,並在1988年組織召開了第一個相當規模的C++會議。在ISO/ANSI C++委員會成立的1989年,他就加入了該委員會,並一直擔任專案編輯。他已經發表了C++方面的100多篇論文,在Addsion-Wesley出版了《C Trap and Pitfalls》,和《Ruminations on C++(C++沉思錄)》(博碩出版)還應邀到世界各地演講。

    Andrew Koenig不僅有著多年的C++開發、研究和教學經驗,而且還親身參與了C++的演化和變革,對C++的變化和發展發揮重要的影響。

 
 
 
     

博碩文化客服信箱
 

dr26962869@gmail.com

 
文教業務團隊
台北、新北、桃園、基隆、宜蘭、花蓮
郭 南 彤
LINE ID:rgtech101
0917-727778
tigerguo@drmaster.com.tw
汪 玉 鳳
LINE ID:0925177716
0925-177716
carlo@drmaster.com.tw
助理分機 519
新竹、苗栗、台中、彰化、南投、雲林
林 世 昌
LINE ID:0925275775
0925-275775
rick@drmaster.com.tw
助理分機 519
嘉義、台南、高雄、屏東、台東
林 月 玲
LINE ID:0926858627
0926-858627
donylin@drmaster.com.tw
助理分機 238
 
MOCC 認證小組
 
  林 雯 玲 電話:02-2696-2869 分機:623 software24@drmaster.com.tw

 

 
 

 

博碩文化股份有限公司 DrMaster Press Co., Ltd.
台灣新北市汐止區新台五路一段112號10樓A棟
Building A, 10F, No.112, Xintai 5th Rd., Sec.1,Xizhi Dist., New Taipei City 221, Taiwan
Tel:02-2696-2869 Fax:02-2696-2867 劃撥帳號:17484299

Copyright© DrMaster Press Co., Ltd. All Rights Reserved.