本書詳細講解了C語言的基本概念和編程技巧。
全書共17章。第1章、第2章介紹了C語言編程的預備知識。第3章~第15章詳細講解了C語言的相關知識,包括數據類型、格式化輸入/輸出、運算符、表達式、語句、循環、字符輸入和輸出、函數、數組和指針、字符和字符串函數、內存管理、文件輸入輸出、結構、位操作等。第16章、第17章介紹C預處理器、C庫和高級數據表示。本書以完整的程序為例,講解C語言的知識要點和注意事項。每章末尾設計了大量複習題和編程練習,幫助讀者鞏固所學知識和提高實際編程能力。附錄給出了各章複習題的參考答案和豐富的參考資料。
本書可作為C語言的教材,適用於需要系統學習C語言的初學者,也適用於鞏固C語言知識或希望進一步提高編程技術的程式設計師。
市面上已經有了許多優秀的講述C語言的書籍,為什麼我們還需要這一本呢?我在大學裡教授C語言編程已有10個年頭,但至今尚未發現一本書是按照我所喜歡的方式來講述指針的。許多書籍用一章的篇幅專門講述指針,而且往往出現在全書的後半部分。但是,僅僅描述指針的語法、並用一些簡單的例子展示其用法是遠遠不夠的。我在授課時,很早便開始講授指針,而且在以後的授課過程中也經常討論指針。我描述它們在各種不同的上下文環境中的有效用法,展示使用指針的編程慣用法(programming idiom)。我還討論了一些相關的課題如編程效率和程序可維護性之間的權衡。指針是本書的線索所在,融會貫通於全書之中。
指針為什麼如此重要?我的信念是:正是指針使C威力無窮。有些任務用其他語言也可以實現,但C能夠更有效地實現;有些任務無法用其他語言實現,如直接訪問硬體,但C卻可以。要想成為一名優秀的C程式設計師,對指針有一個深入而完整的理解是先決條件。
本書並不是一本關於編程的入門圖書。它所面向的讀者應該已經具備了一些編程經驗,或者是一些想學習C,但又不想被諸如為什麼循環很重要以及何時需要使用if語句等膚淺問題耽誤進程的人。
另一方面,我並不要求本書的讀者以前學習過C。我講述了C語言所有方面的內容。這種內容的廣泛覆蓋性使本書不僅適用於學生,也適用於專業人員。也就是說,適用於首次學習C的讀者和那些經驗更豐富的希望進一步提高語言使用技巧的用戶。
優秀的C++書籍把精力集中於與面向對象模型有關的課題上(如類的設計)而不是專注於基本的C技巧,這樣做是對的。但C++是建立在C的基礎之上的,C的基本技巧依然非常重要,特別是那些能夠實現可復用類的技巧。誠然,C++程式設計師在閱讀本書時可以跳過一些他們所熟悉的內容,但他們會在本書中找到許多有用的C工具和技巧。
C代碼。C代碼運行。運行碼運行…請!
——Barbara Ling
所有的C程序都做同一件事,觀察一個字符,然後啥也不幹。
——Peter Weinberge
C語言編程是一項技藝,需要多年曆練才能達到較為完善的境界。一個頭腦敏捷的人很快就能學會C語言中基礎的東西。但要品味出C語言的細微之處,並通過大量編寫各種不同程序成為C語言專家,則耗時甚巨。打個比方說,這是在巴黎點一杯咖啡與在地鐵裡告訴土生土長的巴黎人該在哪裡下車之間的差別。本書是一本關於ANSI C程式語言的高級讀本。它適用於已經編寫過C程序的人,以及那些想迅速獲取一些專家觀點和技巧的人。
編程專家在多年的實踐中建立了自己的技術工具箱,裡面是形形色色的習慣用法、代碼片段和靈活掌握的技巧。他們站在其他更有經驗的同事的肩膀上,或是直接領悟他們的代碼,或是在維護其他人的代碼時聆聽他們的教誨,隨著時間的推移,逐步形成了這些東西。另外一種成為C編程高手的途徑是自省,在認識錯誤的過程中進步。
本書力圖通過揭示一般程式設計師,甚至是經驗老道的職業程式設計師,如何在編程中犯錯誤、摔跟頭,以提倡和鼓勵預防性的程序設計。這些錯誤實際上一旦被程式設計師真正認識和理解,並不難避免。因此,本書闡述的重點不是一般原則,而是一個個具體的例子。
如果你是一個程式設計師並且開發中真正用到C語言來解決複雜問題,這本書應該成為你的案頭必備書籍。即使你已經是一個C語言的專家級程式設計師,仍然有必要擁有這本書,很多讀過本書早期手稿的專業C程式設計師常常感嘆:「就在上星期我還遇到這樣一個Bug!」如果你正在教授C語言課程,本書毫無疑問應該成為你向學生推薦的首選補充閱讀材料。
本書不是對C語言的批評。程式設計師無論使用何種程序設計語言,都有可能遇到麻煩。本書濃縮了作者長達10年的C語言開發經驗,集中闡述了C語言中各種問題和「陷阱」,目的是希望程式設計師讀者能夠從中吸取我本人以及我所見過的其他人所犯錯誤的經驗教訓。
本書不是一本「烹飪菜譜」。我們不能希望可以通過詳盡的指導說明來完全避免錯誤。如果可行的話,那麼所有的交通事故都可以通過在路旁刷上「小心駕駛」的標語來杜絕。對一般人而言最有效的學習方式是從感性的、活生生的事例中學習,比如自己的親身經歷或者他人的經驗教訓。而且,哪怕只是明白了一種特定的錯誤是如何可能發生的,就已經在將來避免該錯誤的路上邁了一大步。