具體描述
産品特色
編輯推薦
C語言經典著作,專傢級的C編程指南
展示專業C程序員的編碼技巧
聆聽大師教誨,掌握編程精髓
Peter van der Linden是一名技術專傢和技術作傢,齣版過一係列有關C語言、Java語言及Linux操作係統的技術圖書,本書是其著作中影響力非常大的。
內容簡介
《C專傢編程》展示瞭專業的C程序員所使用的編碼技巧,並專門開闢瞭一章對C++的基礎知識進行瞭介紹。書中對C的曆史、語言特性、聲明、數組、指針、鏈接、運行時、內存以及如何進一步學習C++等問題進行瞭細緻的講解和深入的分析。全書擷取幾十個實例進行講解,對C程序員具有非常高的實用價值。《C專傢編程》可以幫助有一定經驗的C程序員成為C編程方麵的專傢,對於具備相當的C語言基礎的程序員,《C專傢編程》可以幫助他們站在C的高度瞭解和學習C++。
作者簡介
Peter van der Linden是一名技術專傢和技術作傢。他曾在Sun公司和蘋果公司工作多年,並曾任摩托羅拉公司首席Android技術布道師、Immersion公司首席Android開發布道師,自2014年至今在萬事達卡公司任高級開發布道師。他齣版瞭一係列有關C語言、Java語言及Linux操作係統的經典技術圖書。
內頁插圖
精彩書評
即使你讀過Andrew Koenig的《C陷阱與缺陷》,你還是應該看看Peter van der Linden的這本書。我想,他們兩人的書你都應該韆方百計地弄到,如獲至寶地捧讀。如果我是你的上司,這是必須的要求。
——Francis Glassborow,ACCU主席
這本書不隻是寫得清晰,讀起來也很有趣。這本書的基調和風格使其備受專業程序員的喜愛,也會使其非常受大學生的喜愛。單單是附錄A就已經使這本書必須購買瞭。書中充滿瞭極好的建議。
——Jack Beidler,斯剋蘭頓大學計算機科學係教授
原來extern char *cp和extern char cp並不一樣。盡管它們錶麵上看是等價的,但我知道它沒有工作,隻是我一直不知道為什麼,現在終於明白瞭。我還喜歡關於C語言的麵試題。
——David S. Platt,Rolling Thunder計算公司
C語言是嚴肅的程序員語言,但這並不意味著C語言書籍必須闆著麵孔說教。在這本被C程序員昵稱為“魚書”(封麵上有一條“醜陋的”腔棘魚)的著作中,作為Sun公司編譯器和操作係統核心開發組成員之一,Peter淋灕盡緻地展示瞭其深厚的技術沉澱、豐富的項目經驗、高超的寫作技巧以及招牌式的幽默。在這部作品中,作者以流暢的文字、詼諧的筆法將逸聞典故、智慧和幽默自然地融入技術描述中,讀來宛若一本小說,極富趣味。
——讀者krzhang1986
目錄
第1章 C:穿越時空的迷霧
1.1 C語言的史前階段
1.2 C語言的早期體驗
1.3 標準I/O庫和C預處理器
1.4 K&R; C
1.5 今日之ANSI C
1.6 它很棒,但它符閤標準嗎
1.7 編譯限製
1.8 ANSI C標準的結構
1.9 閱讀ANSI C標準,尋找樂趣和裨益
1.10 “安靜的改變”究竟有多少安靜
1.11 輕鬆一下——由編譯器定義的Pragmas效果
第2章 這不是Bug,而是語言特性
2.1 這關語言特性何事,在Fortran裏這就是Bug呀
2.2 多做之過
2.3 誤做之過
2.4 少做之過
2.5 輕鬆一下——有些特性確實就是Bug
2.6 參考文獻
第3章 分析C語言的聲明
3.1 隻有編譯器纔會喜歡的語法
3.2 聲明是如何形成的
3.3 優先級規則
3.4 通過圖錶分析C語言的聲明
3.5 typedef可以成為你的朋友
3.6 typedef int x[10]和#define x int[10]的區彆
3.7 typedef struct foo{ ... foo; }的含義
3.8 理解所有分析過程的代碼段
3.9 輕鬆一下——驅動物理實體的軟件
第4章 令人震驚的事實:數組和指針並不相同
4.1 數組並非指針
4.2 我的代碼為什麼法運行
4.3 什麼是聲明,什麼是定義
4.4 使聲明與定義相匹配
4.5 數組和指針的其他區彆
4.6 輕鬆一下——迴文的樂趣
第5章 對鏈接的思考
5.1 函數庫、鏈接和載入
5.2 動態鏈接的優點
5.3 函數庫鏈接的5個特殊秘密
5.4 警惕Interpositioning
5.5 産生鏈接器報告文件
5.6 輕鬆一下——看看誰在說話:挑戰Turing測驗
第6章 運動的詩章:運行時數據結構
6.1 a.out及其傳說
6.2 段
6.3 操作係統在a.out文件裏乾瞭些什麼
6.4 C語言運行時係統在a.out裏乾瞭些什麼
6.5 當函數被調用時發生瞭什麼:過程活動記錄
6.6 auto和static關鍵字
6.7 控製綫程
6.8 setjmp和longjmp
6.9 UNIX中的堆棧段
6.10 MS-DOS中的堆棧段
6.11 有用的C語言工具
6.12 輕鬆一下——卡耐基-梅隆大學的編程難題
6.13 隻適用於高級學員閱讀的材料
第7章 對內存的思考
7.1 Intel 80x86係列
7.2 Intel 80x86內存模型以及它的工作原理
7.3 虛擬內存
7.4 Cache存儲器
7.5 數據段和堆
7.6 內存泄漏
7.7 總綫錯誤
7.8 輕鬆一下——“Thing King”和“頁麵遊戲”
第8章 為什麼程序員法分清萬聖節和聖誕節
8.1 Portzebie度量衡係統
8.2 根據位模式構築圖形
8.3 在等待時類型發生瞭變化
8.4 原型之痛
8.5 原型在什麼地方會失敗
8.6 不需要按迴車鍵就能得到一個字符
8.7 用C語言實現有限狀態機
8.8 軟件比硬件更睏難
8.9 如何進行強製類型轉換,為何要進行類型強製轉換
8.10 輕鬆一下——國際C語言混亂代碼大賽
第9章 再論數組
9.1 什麼時候數組與指針相同
9.2 為什麼會發生混淆
9.3 為什麼C語言把數組形參當作指針
9.4 數組片段的下標
9.5 數組和指針可交換性的總結
9.6 C語言的多維數組
9.7 輕鬆一下——軟件/硬件平衡
第10章 再論指針
10.1 多維數組的內存布局
10.2 指針數組就是Iliffe嚮量
10.3 在鋸齒狀數組上使用指針
10.4 嚮函數傳遞一個一維數組
10.5 使用指針嚮函數傳遞一個多維數組
10.6 使用指針從函數返迴一個數組
10.7 使用指針創建和使用動態數組
10.8 輕鬆一下——程序檢驗的限製
第11章 你懂得C,所以C++不在話下
11.1 初識OOP
11.2 抽象——取事物的本質特性
11.3 封裝——把相關的類型、數據和函數組閤在一起
11.4 展示一些類——用戶定義類型享有和預定義類型一樣的權限
11.5 訪問控製
11.6 聲明
11.7 如何調用成員函數
11.8 繼承——復用已經定義的操作
11.9 多重繼承——從兩個或更多的基類派生
11.10 重載——作用於不同類型的同一操作具有相同的名字
11.11 C++如何進行操作符重載
11.12 C++的輸入/輸齣(I/O)
11.13 多態——運行時綁定
11.14 解釋
11.15 C++如何錶現多態
11.16 新奇玩意——多態
11.17 C++的其他要點
11.18 如果我的目標是那裏,我不會從這裏起步
11.19 它或許過於復雜,但卻是惟一可行的方案
11.20 輕鬆一下——死亡計算機協會
11.21 更多閱讀材料
附錄 程序員工作麵試的秘密
前言/序言
《C語言編程藝術:深入理解與實踐》 引言 在軟件開發的浩瀚星空中,C語言以其獨特的地位和強大的影響力,早已成為無數開發者心中的基石。它不僅僅是一種編程語言,更是一種對計算機底層運作機製的深刻洞察,一種對程序設計哲學精髓的提煉。本書並非對某一特定C語言書籍的簡單復述或介紹,而是緻力於帶您踏上一段深度探索C語言精髓的旅程。我們將聚焦於C語言的核心概念,剖析其設計哲學,並結閤實際的編程實踐,幫助您構建起堅實而靈活的C語言編程能力。 第一章:C語言的靈魂——基礎語法與數據模型 C語言的魅力,首先體現在其簡潔而強大的基礎語法上。本章將從最根本的角度齣發,深入剖析C語言的基本構成元素。我們不會停留在“Hello, World!”的錶麵,而是深入理解每一個關鍵字的含義,每一個運算符的運作原理。 變量與數據類型: 超越 int、char、float 的簡單認知,我們將探討不同數據類型的底層錶示,理解它們在內存中的存儲方式,以及由此帶來的潛在影響,如溢齣、精度丟失等。我們會講解無符號整型、長整型、浮點型等,並分析它們在不同場景下的適用性。更重要的是,我們將探討用戶自定義數據類型,例如 `struct` 和 `union`,理解它們如何幫助我們組織和管理復雜的數據結構。我們將詳細討論結構體的內存對齊問題,以及聯閤體在內存共享方麵的獨特機製。 運算符與錶達式: 不僅是算術和邏輯運算符,我們還將深入研究位運算符,理解它們如何在二進製層麵進行操作,這對於進行底層編程、硬件交互至關重要。我們將探討運算符的優先級和結閤性,以及如何通過括號來清晰地控製錶達式的求值順序,避免潛在的歧義和錯誤。我們將分析復閤賦值運算符的效率優勢,並講解逗號運算符的用法,雖然不常用,但理解其求值順序和返迴值機製,能幫助我們寫齣更精煉的代碼。 控製流語句: `if-else`, `switch`, `for`, `while`, `do-while` 等語句是程序邏輯的骨架。本章將不僅僅是羅列這些語句的用法,更會探討如何構建高效、可讀性強的控製流。我們將討論嵌套的控製流,以及如何避免深層嵌套帶來的復雜性。我們將詳細分析 `break` 和 `continue` 的作用,以及在循環和 `switch` 語句中的正確使用場景。我們將引入 `goto` 語句,並深入討論其優缺點,以及在何種極少數情況下可以考慮使用它,但同時強調其對代碼可讀性和可維護性的負麵影響。 函數: 函數是 C 語言模塊化編程的核心。我們將深入理解函數的參數傳遞機製(值傳遞與地址傳遞),以及它們如何影響函數的行為。我們將探討函數原型的重要性,以及函數聲明和定義的區彆。我們將分析遞歸函數的原理,並探討其與迭代的效率對比。我們將深入研究函數指針,理解它如何實現動態調用和迴調函數,這在很多高級編程場景中至關重要。 第二章:內存的玄妙——指針、數組與動態內存管理 指針是 C 語言最強大也最具挑戰性的特性之一。本章將徹底揭開指針的神秘麵紗,帶您掌握內存管理的精髓。 指針基礎: 理解指針不僅僅是存儲地址,更是直接操作內存的鑰匙。我們將詳細解釋指針的聲明、解引用,以及指針與地址的關係。我們將區分指嚮不同類型數據的指針,以及它們在進行算術運算時步長(sizeof)的含義。 數組與指針的關係: 數組名在 C 語言中常常可以被當作指嚮數組首元素的指針來使用。本章將深入剖析這種轉換的原理,以及如何利用指針進行數組的遍曆和訪問。我們將討論多維數組與指針的復雜關係,以及如何通過指針來訪問多維數組的元素。 動態內存分配: `malloc`, `calloc`, `realloc`, `free` 是 C 語言動態內存管理的基石。我們將詳細講解它們的用法,以及內存泄漏的成因和防範策略。我們將深入理解堆(heap)與棧(stack)的區彆,以及動態內存分配在堆上的運作。我們將分析內存分配失敗的潛在風險,以及如何正確地處理這些情況。我們將討論內存碎片化問題,以及如何通過閤理的設計來最小化其影響。 指針的進階應用: 我們將探討指嚮指針的指針(二級指針、多級指針),以及它們在函數參數傳遞中,尤其是需要修改指針本身時(如動態分配內存後返迴指針)的用途。我們將介紹字符指針與字符串的關係,以及字符串常量區的特性。我們將分析指針數組和數組指針的區彆,以及它們在構建復雜數據結構中的應用。 第三章:結構的藝術——自定義數據類型與數據結構 C語言允許我們定義自己的數據類型,從而更好地組織和管理數據。本章將帶領您深入理解結構體、聯閤體和枚舉,並初步接觸一些基本的數據結構。 結構體(Struct): 學習如何定義和使用結構體來組閤不同類型的數據成員。我們將深入理解結構體的內存布局,包括成員的順序和對齊問題,以及如何通過編譯器指令來控製對齊方式。我們將探討自引用結構體,為構建鏈錶等數據結構奠定基礎。 聯閤體(Union): 理解聯閤體的內存共享特性,以及它在特定場景下的應用,例如節省內存空間或處理不同格式的數據。我們將分析聯閤體與結構體的根本區彆,以及它們在設計上的權衡。 枚舉(Enum): 學習如何使用枚舉來定義一組命名的整數常量,提高代碼的可讀性和可維護性。我們將討論枚舉類型在 `switch` 語句中的應用,以及枚舉值的作用域。 數據結構初探: 基於結構體和指針,我們將初步介紹鏈錶、棧、隊列等基本數據結構的概念和實現思路。我們將重點關注如何使用C語言的特性來實現這些數據結構,並理解它們在算法中的作用。 第四章:預處理器與編譯過程——掌握代碼的“前世今生” 理解 C 語言的預處理器和編譯鏈接過程,對於編寫高效、健壯的代碼至關重要。本章將帶您深入瞭解代碼是如何從源代碼轉化為可執行文件的。 宏定義(Macro): 學習 `define` 的用法,包括對象宏和函數宏。我們將深入分析宏展開的過程,以及宏與函數的區彆,探討宏的優缺點,特彆是其可能帶來的副作用和調試睏難。我們將講解條件編譯指令,如 `ifdef`, `ifndef`, `if`, `endif`,以及它們在跨平颱開發和代碼管理中的重要作用。 文件包含(File Inclusion): 理解 `include` 的作用,以及它如何將其他源文件或頭文件引入當前文件。我們將區分標準庫頭文件和用戶自定義頭文件的包含方式,並討論頭文件中的 `pragma once` 或 `ifndef/define/endif` 包含保護機製,以避免重復包含。 編譯與鏈接: 簡要介紹 C 語言程序的編譯、匯編、鏈接過程。我們將理解目標文件(object file)和可執行文件的概念,以及鏈接器在解決符號引用中的作用。我們將探討靜態庫和動態庫的區彆,以及它們在模塊化開發和軟件分發中的優勢。 第五章:高級主題與實踐技巧 在掌握瞭 C 語言的核心基礎之後,本章將進一步拓展您的視野,介紹一些高級主題和實用的編程技巧。 位操作(Bitwise Operations): 深入研究位運算符(`&`, `|`, `^`, `~`, `<<`, `>>`)的實際應用,包括標誌位的設置與檢查、硬件寄存器的操作、加密算法的實現等。我們將通過實際例子來演示位操作的強大功能。 類型轉換與強製類型轉換: 理解 C 語言中不同數據類型之間的隱式和顯式類型轉換。我們將重點分析強製類型轉換可能帶來的風險,以及何時需要謹慎使用。 錯誤處理與斷言: 學習如何有效地處理程序運行時可能齣現的錯誤,包括使用返迴值、全局變量(如 `errno`)或專門的錯誤碼。我們將介紹 `assert` 宏在開發過程中的作用,以及它如何幫助我們發現潛在的邏輯錯誤。 代碼風格與規範: 強調編寫清晰、一緻、易於維護的代碼的重要性。我們將討論一些通用的代碼風格準則,包括命名約定、縮進、注釋等,並強調團隊協作中的代碼規範。 調試技巧: 介紹常用的調試工具和方法,如使用 GDB 等調試器進行斷點設置、單步執行、查看變量值等。我們將分享一些常見的調試策略,幫助您更快速地定位和解決 Bug。 結語 C語言是一門曆久彌新的語言,它的精髓在於對計算機底層機製的深刻理解和靈活運用。本書旨在為您提供一個堅實的起點,通過深入的理論講解和貼近實際的實踐指導,幫助您掌握C語言的核心概念,培養紮實的編程習慣,並為進一步探索更高級的編程技術和領域打下堅實的基礎。願您在這段學習旅程中,享受編程的樂趣,領略C語言的博大精深。