出版時間:2010-7 出版社:北京航空航天大學(xué)出版社 作者:陳正沖 編著 頁數(shù):165 字?jǐn)?shù):252000
Tag標(biāo)簽:無
前言
我面試過很多人,包括應(yīng)屆本科、碩士和工作多年的程序員,在問到C語言相關(guān)問題的時候,總是沒幾個人能完全答上我的問題。甚至一些工作多年,簡歷上寫著“最得意的語言是C語言”、“對C有很深的研究”、“精通C語言”的人也不完全能答對我的問題,更有甚者我問的問題一個都答不上。我也給很多程序員和計(jì)算機(jī)系畢業(yè)的學(xué)生講解過《高級C語言程序設(shè)計(jì)》。每期開課前,我總會問學(xué)生:你感覺C語言學(xué)得怎么樣?難嗎?指針明白嗎?數(shù)組呢?內(nèi)存管理呢?往往學(xué)生回答說:感覺還可以,C語言不難,指針很明白,數(shù)組很簡單,內(nèi)存管理也不難。一般我會再問一個問題:通過這個班的學(xué)習(xí),你想達(dá)到什么程度?很多學(xué)生回答:精通C語言。我告訴他們:我很無奈,也很無語,因?yàn)槲彝耆诤鸵蝗簶I(yè)余者或者是C語言愛好者在對話。你們浪費(fèi)了大學(xué)學(xué)習(xí)計(jì)算機(jī)的時間,念了幾年大學(xué),連C語言的門都沒摸著。現(xiàn)在大多數(shù)學(xué)校計(jì)算機(jī)系都開了C、C++、Java、C#等語言,好像什么都學(xué)了,但是什么都不會,更可悲的是有些大學(xué)居然取消了C語言課程,認(rèn)為其過時了。我個人的觀點(diǎn)是“十鳥在林,不如一鳥在手”,真正把C語言整明白了再學(xué)別的語言也很簡單,如果C語言都沒整明白,別的語言學(xué)得再好也是花架子,因?yàn)槟悴⒉涣私獾讓邮窃趺椿厥?。?dāng)然我也從來不認(rèn)為一個沒學(xué)過匯編的人能真正掌握C語言的真諦。我個人一直認(rèn)為,普通人用C語言在3年之下,一般來說,還沒掌握C語言;5年之下,一般來說還沒熟悉C語言;10年之下,談不上精通。所以,我告訴我的學(xué)生:聽完我的課,遠(yuǎn)達(dá)不到精通的目標(biāo),熟悉也達(dá)不到,掌握也達(dá)不到。
內(nèi)容概要
本書由作者結(jié)合自身多年嵌入式C語言開發(fā)經(jīng)驗(yàn)和平時講解C語言的心得體會整理而成,其中有很多作者獨(dú)特的見解或看法。由于并不是從頭到尾講解C語言的基礎(chǔ)知識,所以本書并不適用于C語言零基礎(chǔ)的讀者,其內(nèi)容要比一般的C語言圖書深得多、細(xì)致得多,其中有很多問題是各大公司的面試或筆試題。 本書適合廣大計(jì)算機(jī)系學(xué)生、初級程序員參考學(xué)習(xí),也適合計(jì)算機(jī)系教師、中高級程序員參考使用。
作者簡介
陳正沖,湖南沅江人,畢業(yè)于長春光學(xué)精密機(jī)械學(xué)院數(shù)學(xué)系。具有豐富的嵌入式軟件開發(fā)與管理經(jīng)驗(yàn),曾多次舉辦各種技術(shù)和管理方面的講座和培訓(xùn)。講課深入、透徹、幽默,深受學(xué)員好評。目前從事與CMMI相關(guān)的流程管理方面的工作。
書籍目錄
第1章 關(guān)鍵字 1.1 最寬宏大量的關(guān)鍵字——auto 1.2 最快的關(guān)鍵字——register 1.2.1 皇帝身邊的小太監(jiān)——寄存器 1.2.2 使用register修飾符的注意點(diǎn) 1.3 最名不符實(shí)的關(guān)鍵字——static 1.3.1 修飾變量 1.3.2 修飾函數(shù) 1.4 基本數(shù)據(jù)類型——short、int、long、char、float、double 1.4.1 數(shù)據(jù)類型與“模子” 1.4.2 變量的命名規(guī)則 1.5 最冤枉的關(guān)鍵字——sizeof 1.5.1 常年被人誤認(rèn)為函數(shù) 1.5.2 sizeof(int)*p表示什么意思 1.6 signed、unsigned關(guān)鍵字 1.7 if、else組合 1.7.1 bool變量與“零值”進(jìn)行比較 1.7.2 float變量與“零值”進(jìn)行比較 1.7.3 指針變量與“零值”進(jìn)行比較 1.7.4 else到底與哪個if配對呢 1.7.5 if語句后面的分號 1.7.6 使用if語句的其他注意事項(xiàng) 1.8 switch、case組合 1.8.1 不要拿青龍偃月刀去削蘋果 1.8.2 case關(guān)鍵字后面的值有什么要求嗎 1.8.3 case語句的排列順序 1.8.4 使用case語句的其他注意事項(xiàng) 1.9 do、while、for關(guān)鍵字 1.9.1 break與continue的區(qū)別 1.9.2 循環(huán)語句的注意點(diǎn) 1.10 goto關(guān)鍵字 1.11 void關(guān)鍵字 1.11.1 void a 1.11.2 void修飾函數(shù)返回值和參數(shù) 1.11.3 void指針 1.11.4 void不能代表一個真實(shí)的變量 1.12 return關(guān)鍵字 1.13 const關(guān)鍵字也許該被替換為readonly 1.13.1 const修飾的只讀變量 1.13.2 節(jié)省空間,避免不必要的內(nèi)存分配,同時提高效率 1.13.3 修飾一般變量 1.13.4 修飾數(shù)組 1.13.5 修飾指針 1.13.6 修飾函數(shù)的參數(shù) 1.13.7 修飾函數(shù)的返回值 1.14 最易變的關(guān)鍵字——volatile 1.15 最會帶帽子的關(guān)鍵字——extern 1.16 struct關(guān)鍵字 1.16.1 空結(jié)構(gòu)體多大 1.16.2 柔性數(shù)組 1.16.3 struct與class的區(qū)別 1.17 union關(guān)鍵字 1.17.1 大小端模式對union類型數(shù)據(jù)的影響 1.17.2 如何用程序確認(rèn)當(dāng)前系統(tǒng)的存儲模式 1.18 enum關(guān)鍵字 1.18.1 枚舉類型的使用方法 1.18.2 枚舉與#define宏的區(qū)別 1.19 偉大的縫紉師——typedef關(guān)鍵字 1.19.1 關(guān)于馬甲的笑話 1.19.2 歷史的誤會——也許應(yīng)該是typerename 1.19.3 typedef與#define的區(qū)別 1.19.4 #define a int\[10\]與typedef int a\[10\]第2章 符號 2.1 注釋符號 2.1.1 幾個似非而是的注釋問題 2.1.2 y = x/*p 2.1.3 怎樣才能寫出出色的注釋 2.2 接續(xù)符和轉(zhuǎn)義符 2.3 單引號、雙引號 2.4 邏輯運(yùn)算符 2.5 位運(yùn)算符 2.5.1 左移和右移 2.5.2 0x01[[2+3的值為多少 2.6 花括號 2.7 ++、--操作符 2.7.1 ++i+++i+++i 2.7.2 貪心法 2.8 2 /(-2)的值是多少 2.9 運(yùn)算符的優(yōu)先級 2.9.1 運(yùn)算符的優(yōu)先級表 2.9.2 一些容易出錯的優(yōu)先級問題第3章 預(yù)處理 3.1 宏定義 3.1.1 數(shù)值宏常量 3.1.2 字符串宏常量 3.1.3 用define宏定義注釋符號“?” 3.1.4 用define宏定義表達(dá)式 3.1.5 宏定義中的空格 3.1.6 #undef 3.2 條件編譯 3.3 文件包含 3.4 #error預(yù)處理 3.5 #line預(yù)處理 3.6 #pragma預(yù)處理 3.6.1 #pragma message 3.6.2 #pragma code_seg 3.6.3 #pragma once 3.6.4 #pragma hdrstop 3.6.5 #pragma resource 3.6.6 #pragma warning 3.6.7 #pragma comment 3.6.8 #pragma pack 3.7“#”運(yùn)算符 3.8“##”預(yù)算符第4章 指針和數(shù)組 4.1 指針 4.1.1 指針的內(nèi)存布局 4.1.2“*”與防盜門的鑰匙 4.1.3 int*p=NULL和*p=NULL有什么區(qū)別 4.1.4 如何將數(shù)值存儲到指定的內(nèi)存地址 4.1.5 編譯器的bug 4.1.6 如何達(dá)到手中無劍、胸中也無劍的境界 4.2 數(shù)組 4.2.1 數(shù)組的內(nèi)存布局 4.2.2 省政府和市政府的區(qū)別——&a\[0\]和&a的區(qū)別 4.2.3 數(shù)組名a作為左值和右值的區(qū)別 4.3 指針和數(shù)組之間的恩恩怨怨 4.3.1 以指針的形式訪問和以下標(biāo)的形式訪問 4.3.2 a和&a的區(qū)別 4.3.3 指針和數(shù)組的定義與聲明 4.3.4 指針和數(shù)組的對比 4.4 指針數(shù)組和數(shù)組指針 4.4.1 指針數(shù)組和數(shù)組指針的內(nèi)存布局 4.4.2 int (*)\[10\] p2——也許應(yīng)該這么定義數(shù)組指針 4.4.3 再論a和&a之間的區(qū)別 4.4.4 地址的強(qiáng)制轉(zhuǎn)換 4.5 多維數(shù)組和多級指針 4.5.1 二維數(shù)組 4.5.2 二級指針 4.6 數(shù)組參數(shù)和指針參數(shù) 4.6.1 一維數(shù)組參數(shù) 4.6.2 一級指針參數(shù) 4.6.3 二維數(shù)組參數(shù)和二級指針參數(shù) 4.7 函數(shù)指針 4.7.1 函數(shù)指針的定義 4.7.2 函數(shù)指針的使用 4.7.3 (*(void(*) ())0)()——這是什么 4.7.4 函數(shù)指針數(shù)組 4.7.5 函數(shù)指針數(shù)組指針第5章 內(nèi)存管理 5.1 什么是野指針 5.2 棧、堆和靜態(tài)區(qū) 5.3 常見的內(nèi)存錯誤及對策 5.3.1 指針沒有指向一塊合法的內(nèi)存 5.3.2 為指針分配的內(nèi)存太小 5.3.3 內(nèi)存分配成功,但并未初始化 5.3.4 內(nèi)存越界 5.3.5 內(nèi)存泄漏 5.3.6 內(nèi)存已經(jīng)被釋放了,但是繼續(xù)通過指針來使用第6章 函數(shù) 6.1 函數(shù)的由來與好處 6.2 編碼風(fēng)格 6.3 函數(shù)設(shè)計(jì)的一般原則和技巧 6.4 函數(shù)遞歸 6.4.1 一個簡單但易出錯的遞歸例子 6.4.2 不使用任何變量編寫strlen函數(shù)第7章 文件結(jié)構(gòu) 7.1 文件內(nèi)容的一般規(guī)則 7.2 文件名命名的規(guī)則 7.3 文件目錄的規(guī)則第8章 關(guān)于面試的秘密 8.1 外表形象 8.1.1 學(xué)生就是學(xué)生,穿著符合自己身份就行了 8.1.2 不要一身異味,熏暈考官對你沒好處 8.1.3 女生不要帶2個以上耳環(huán),不要涂指甲 8.2 內(nèi)在表現(xiàn) 8.2.1 談吐要符合自己身份,切忌不懂裝懂、滿嘴胡咧咧 8.2.2 態(tài)度是一種習(xí)慣,習(xí)慣決定一切 8.2.3 要學(xué)會尊敬別人和懂禮貌 8.3 如何寫一份讓考官眼前一亮的簡歷 8.3.1 個人信息怎寫 8.3.2 求職意向和個人的技能、獲獎或榮譽(yù)情況怎么突出 8.3.3 成績表是應(yīng)屆生必須要準(zhǔn)備的附錄1 C語言基礎(chǔ)測試題附錄2 C語言基礎(chǔ)測試題答案后記參考文獻(xiàn)
章節(jié)摘錄
插圖:其實(shí)在匯編語言階段,函數(shù)這個概念還是比較模糊的。匯編語言的代碼往往就是從入口開始一條一條執(zhí)行,直到遇到跳轉(zhuǎn)指令(比如ARM指令B、BL、BX、BLX之類)然后才跳轉(zhuǎn)到目的指令處執(zhí)行。這個時候所有的代碼僅僅是按其將要執(zhí)行的順序排列而已。后來人們發(fā)現(xiàn)這樣寫代碼非常費(fèi)勁,容易出錯,也不方便。于是想出一個辦法,把一些功能相對來說能成為一個整體的代碼放到一起打包,通過一些數(shù)據(jù)接口和外界通信。這就是函數(shù)的由來。那函數(shù)能給我們帶來什么好處呢?簡單來說可以概括為以下幾點(diǎn):①降低復(fù)雜性:使用函數(shù)最首要的原因是為了降低程序的復(fù)雜性,可以使用函數(shù)來隱含信息,從而使你不必再考慮這些信息。②避免重復(fù)代碼段:如果在兩個不同函數(shù)中的代碼很相似,這往往意味著分解工作有誤。這時,應(yīng)該把兩個函數(shù)中重復(fù)的代碼都取出來,把公共代碼放入一個新的通用函數(shù)中,然后再讓這兩個函數(shù)調(diào)用新的通用函數(shù)。通過使公共代碼只出現(xiàn)一次,可以節(jié)約許多空間,因?yàn)橹灰谝粋€地方改動代碼就可以了。這時代碼也更可靠了。③限制改動帶來的影響:在獨(dú)立區(qū)域進(jìn)行改動,由此帶來的影響也只限于一個或最多幾個區(qū)域中。④隱含順序:如果程序通常先從用戶那里讀取數(shù)據(jù),然后再從一個文件中讀取輔助數(shù)據(jù),那么在設(shè)計(jì)系統(tǒng)時編寫一個函數(shù),隱含那個首先執(zhí)行的信息。⑤改進(jìn)性能:把代碼段放入函數(shù)也使得用更快的算法或執(zhí)行更快的語言(如匯編)來改進(jìn)這段代碼的工作變得容易些。
后記
寫書不容易,寫一本好書更不容易,寫一本滿足所有讀者的好書更是幾乎沒有可能。本書的初稿掛在CSDN網(wǎng)站之后,3天內(nèi)下載量沖到周排行榜第一名,2個月單鏈接下載量達(dá)4 000以上,至于各個網(wǎng)站轉(zhuǎn)載后的下載量更是無從統(tǒng)計(jì)了。目前,僅百度文庫的下載量已實(shí)破3萬次。從網(wǎng)友的反饋來看,絕大多數(shù)還是覺得本書非常不錯,但仍然還是有極個別網(wǎng)友覺得本書滿足不了他們的要求。比如有人提出,本書沒有從匯編的角度來解剖C語言,是個遺憾。其實(shí),我個人并非沒有考慮過深入到匯編層次,但最終沒有這么做,原因有以下幾點(diǎn)。第一,C語言和匯編語言本來就是兩種語言,既然本書的定位是講解C語言,那就盡量在C語言的層次上解決問題。況且,很多人沒學(xué)過或是對匯編語言不太懂,如果一下子就深入到匯編語言,可能會加大理解本書的難度,得不償失。因?yàn)楸緯囊粋€顯著特點(diǎn)就是深入淺出,將難以理解的問題通過各種方式來表達(dá),從而降低學(xué)習(xí)的難度。第二,從匯編語言的層次來解讀C語言,這個事已經(jīng)有人做了。姚新顏先生花了好幾年時間寫的《C語言:標(biāo)準(zhǔn)與實(shí)現(xiàn)》,就是從匯編層面來解讀C語言,已經(jīng)給讀者獻(xiàn)上了一份厚禮。我深感學(xué)識水平遠(yuǎn)不如姚先生,所以未敢班門弄斧。第三,相對于很多讀者所學(xué)的x86匯編,我個人更熟悉ARM匯編一些。如果要從匯編的層面來寫書,我可能沒有太多時間學(xué)習(xí)x86匯編,而有可能以ARM匯編為基礎(chǔ),這樣同樣有可能增加讀者的學(xué)習(xí)難度和降低讀者學(xué)習(xí)C語言的興趣。第四,匯編語言目前的確用得很少了,哪怕是在嵌入式開發(fā)方面,絕大多數(shù)情況下用C語言也可以解決問題,偶爾會內(nèi)嵌幾句匯編代碼,很少使用純匯編寫代碼。我對匯編的看法是,要懂它,但不要花過多的精力。
媒體關(guān)注與評論
《C語言深度解剖》從另一個層面來讓你更深地了解c語言的精華所在,很好的一本書?! W(wǎng)友,zuoshaobokzcj4這是一部經(jīng)典的c語言講解教案,你可以在其中學(xué)習(xí)到你從沒思考過的關(guān)鍵知識! ——網(wǎng)友,C1989如果是學(xué)習(xí)過c語言的人,那么看幾頁就會覺得很不一般,大力推薦學(xué)過或正在學(xué)習(xí)C語言的人閱讀此書,絕對受益匪淺。 ——網(wǎng)友,caliow偶然在網(wǎng)上看到這本書,讀畢,獲益頗多??催^不少c語言的書籍,貌似很少有哪本書提過哪些東西應(yīng)該寫在.h頭文件里,哪些東西應(yīng)該寫在.cpp里。 ——網(wǎng)友,驚羽九天強(qiáng)烈推薦,兩位老師20年編程工作的經(jīng)驗(yàn)總結(jié),一位資深嵌入式工程師的嘔心瀝血之作!堪稱同類資料中之經(jīng)典中的經(jīng)典?! W(wǎng)友,HXW718059156這是一篇c語言高手的箴言,將c語言的精髓展示出來?! W(wǎng)友,lingzhimeng很好,對有些問題的見解很有深度,提出了很多人沒有想到的問題,其中對關(guān)鍵字的解釋很有創(chuàng)意,諸如static等,用了很多很好的例子,值得一看?! W(wǎng)友,F(xiàn)engHui
編輯推薦
《C語言深度解剖:解開程序員面試筆試的秘密》:博客藏經(jīng)閣叢書
圖書封面
圖書標(biāo)簽Tags
無
評論、評分、閱讀與下載