出版時間:2011-3 出版社:電子工業(yè)出版社 作者:宋勁杉 頁數(shù):471
Tag標簽:無
前言
本書最初是為北京亞嵌教育研究中心的嵌入式Linux系統(tǒng)工程師就業(yè)班課程量身定做的教材之一。該課程是為期四個月的全日制職業(yè)培訓,要求學員畢業(yè)時具備非常Solid的C編程能力,能熟練地使用Linux系統(tǒng),同時對計算機體系結(jié)構(gòu)與指令集、操作系統(tǒng)原理和設(shè)備驅(qū)動程序都有較深入的了解。然而學員入學時的水平是非常初級而且參差不齊的:學歷有???、本科也有研究生,專業(yè)有和計算機相關(guān)的也有很不相關(guān)的(例如會計專業(yè)),以前從事的職業(yè)有和技術(shù)相關(guān)的也有完全不相關(guān)的(例如HR),年齡從二十出頭到三十五六歲的都有。這么多背景完全不同、基礎(chǔ)完全不同、思維習慣和理解能力完全不同的人來聽同一堂課,大家都迫切希望學會嵌入式開發(fā)技術(shù),投身IT行業(yè),這就是職業(yè)教育的特點,也是我編本書時需要考慮的主要問題?! W習編程絕不是一件簡單的事,尤其是對于零基礎(chǔ)的初學者來說。大學的計算機專業(yè)有四年時間從零基礎(chǔ)開始培養(yǎng)一個人,微積分、線性代數(shù)、隨機數(shù)學、離散數(shù)學、組合數(shù)學、自動機、編譯原理、操作系統(tǒng)、計算機組成原理等一堆基礎(chǔ)課,再加上C/C++、Java、數(shù)據(jù)庫、網(wǎng)絡(luò)、軟件工程、計算機圖形學等一堆專業(yè)課,最后培養(yǎng)出一個能找到工作的學生。很遺憾這最后一條很多學校沒有做好,來亞嵌培訓的很多學生這四年就是這么學過來的,但據(jù)我們考查他們的基礎(chǔ)幾乎為零,我不知道為什么。與之形成鮮明對比的是,只給我們四個月的時間,同樣要求從零基礎(chǔ)開始,最后培養(yǎng)出一個能找到工作的學生,而且還要保證他找到工作,這就是職業(yè)教育的特點?! 槭裁次艺f“只給我們四個月的時間”?我們倒是想教四年呢,但學時的長短我們做不了主,是由市場規(guī)律決定的。四年的任務要求四個月做好,要怎么完成這樣一個幾乎不可能的任務呢?有些職業(yè)教育給出的答案是“實用主義”,打出了“有用就學,沒有用就不學”的口號,大肆貶低說大學里教的基礎(chǔ)課都是過時的、無用的,只有他們教的技術(shù)才是實用的,這種炒作很不好,我認為大學里教的每一門課都是非常有用的,基礎(chǔ)知識在任何時候都不會過時,倒是那些時髦的“實用技術(shù)”有可能很快就過時了?! ∷哪甑娜蝿赵趺床拍苡盟膫€月做好?我們給出的答案是“優(yōu)化”?,F(xiàn)在大學里安排的課程體系最大的缺點就是根本不考慮優(yōu)化。每個過來人都會有這樣的感覺:大一大二學了好多數(shù)學課,卻不知道都是干什么用的,也不懂為什么要學。連它有什么用都不知道怎么能有興趣學好呢?然后到大三大四學專業(yè)課時,用到以前的知識了,才發(fā)現(xiàn)以前學的數(shù)學是多么有用,然而早就忘得一干二凈了,考完試都還給老師了,回頭重新學吧,這時候發(fā)現(xiàn)很多東西以前根本沒學明白,現(xiàn)在才真的學明白了,那么前兩年的時間豈不是都浪費了?大學里的課程體系還有一個缺點就是不靈活,每門課必須占一個學期,必須由一個老師教,不同課程的老師之間沒有任何溝通和銜接,其實這些課程之間是相互依賴的,把它們強行拆開是不符合人的認知規(guī)律的。比如我剛上大學的時候,大一上半學期就被逼著學C語言,其實C語言是一門很難的編程語言,不懂編譯原理、操作系統(tǒng)和計算機體系結(jié)構(gòu)根本不可能學明白,那半個學期自然就浪費掉了。當時幾乎所有學校的計算機相關(guān)專業(yè)都是這樣,大一上來就學C語言,有的學校更瘋狂,上來就學C++,導致大多數(shù)學生都以為自己會C語言,但其實都是半吊子水平,到真正寫代碼的時候經(jīng)常為一個Bug搞得焦頭爛額,卻沒有機會再系統(tǒng)地學一遍C語言,因為在學校看來,C語言課早在大一就給你“上完了”,就像一頓飯已經(jīng)吃完了,不管你吃飽沒吃飽,不會再讓你重吃一遍了。顯而易見,如果要認真地對這些課程做優(yōu)化,的確是有很多水分可以擠的?! ”緯惺裁刺攸c 本書不是孤立地講C語言,而是和編譯原理、操作系統(tǒng)、計算機體系結(jié)構(gòu)結(jié)合起來講?;蛘哒f,本書的內(nèi)容只是以C語言為載體,真正講的是計算機的原理和程序的原理。 強調(diào)基本概念和基本原理,在編排順序上非常重視概念之間的依賴關(guān)系,每次引入一個新的概念,只依賴于前面章節(jié)已經(jīng)講過的概念,而絕不會依賴后面章節(jié)要講的概念。有些地方為了敘述得完整,也會引用后面要講的內(nèi)容,比如說“有關(guān)我們到第章再仔細講解”,凡是這種引用都不是必要的依賴,可以當它不存在,只管繼續(xù)往下看就行了?! ”M量做到每個知識點直到要用的時候才引入。過早引入一個知識點,講完了又不用它,讀者很快就會遺忘,這是不符合認知規(guī)律的?! ”緯嫦蚴裁礃拥淖x者 這是一本從零基礎(chǔ)開始學習編程的書,不要求讀者有任何編程經(jīng)驗,但讀者至少需要具備以下素質(zhì): 熟悉Linux系統(tǒng)的基本操作。如果不具備這一點,請先參考其他教材學習Linux系統(tǒng)的基本操作,熟練之后再學習本書,《鳥哥的Linux私房菜》據(jù)說是Linux系統(tǒng)管理和應用方面比較好的一本書。但學習本書并不需要會很多系統(tǒng)管理技術(shù),只要會用基本命令,會自己安裝系統(tǒng)和軟件包就足夠了?! 【哂懈咧挟厴I(yè)的數(shù)學水平。本書會用到高中的數(shù)學知識。事實上,如果不具有高中畢業(yè)的數(shù)學水平,也不必考慮做程序員了。但并不是說只要具有高中畢業(yè)的數(shù)學水平就足夠做程序員了,只能說看這本書應該沒有問題,數(shù)學是程序員最重要的修養(yǎng),計算機科學其實就是數(shù)學的一個分支,如果你的數(shù)學功底很差,日后還需惡補一下。 具有高中畢業(yè)的英文水平。理由同上?! τ嬎銠C的原理和本質(zhì)深感興趣,不是為就業(yè)而學習,不是為拿高薪而學習,而是真的感興趣,想把一切來龍去脈搞得清清楚楚而學習?! ∥艺J為程序員有三種境界①[1]1:第一種是把編程當作謀生手段的程序員,這種人學點技術(shù)找到工作就覺得修成正果了,上班時能偷懶則偷懶,一聽說加班就怨聲載道,下班后絕不碰跟工作相關(guān)的東西;第二種是希望通過編程不斷提高自己生活品質(zhì)的程序員,這種人向來認為寫代碼和看書學習是自己的事,是為提高自己的競爭力而做的,只不過順便幫老板創(chuàng)造了價值,所以加班什么的從來不計較,不僅積極完成工作,而且每時每刻都在想如何把工作完成得更漂亮;最高境界的是把編程當作畢生愛好的程序員,這種人通常也具備第二種人的品質(zhì),此外還有一些獨特之處,無論是工作中用到的技術(shù)還是與工作無關(guān)的技術(shù)都同樣有興趣鉆研,無論是有報酬的工作還是無報酬的開源軟件都同樣積極參與,甚至退休之后仍把編程當作消遣,換句話說,編程就是一種生活方式。我自己大概屬于第二種人吧。如果你不幸屬于第一種人,那么你不適合做程序員,請放棄學習本書?! ∏谟谒伎肌1緯M最大努力理清概念之間的依賴關(guān)系,力求一站式學習,讀者不需要為了找一個概念的定義去翻其他書,也不需要為了搞清楚一個概念在本書中前后一通亂翻,只需從前到后按順序?qū)W習即可。但一站式學習并不等于傻瓜式學習,有些章節(jié)有一定的難度,需要積極思考才能領(lǐng)會。本書可以替你節(jié)省時間,但不能替你思考,不要指望像看小說一樣走馬觀花看一遍就能學會?! 槭裁匆獙W這本書而不是K&R K&R是公認的世界上最經(jīng)典的C語言教程,這點毫無疑問。在C標準出臺之前,K&R第一版就是事實上的C標準。C89標準出臺之后,K&R跟著標準推出了第二版,可惜此后就沒有更新過了,所以不能反映C89之后C語言的發(fā)展以及最新的C99標準,本書在這方面做了很多補充。上面我說過了,這本書與其說是講C語言,不如說是以C語言為載體講計算機和操作系統(tǒng)的原理,而K&R只是為了講C語言而講C語言,側(cè)重點不同,內(nèi)容編排也很不相同。K&R寫得非常好,代碼和語言都非常簡潔,但很可惜,只有會C語言的人才懂得欣賞它,K&R是非常不適合入門學習的,尤其不適合零基礎(chǔ)的學生入門學習?! ”緯?ldquo;是什么”和“不是什么” 本書包括兩大部分: C語言入門。介紹基本的C語法,幫助沒有任何編程經(jīng)驗的讀者理解什么是程序,怎么寫程序,培養(yǎng)程序員的思維習慣,找到編程的感覺。其中前6章改編自參考文獻[1]?! 語言本質(zhì)。結(jié)合計算機和操作系統(tǒng)的原理講解C程序是怎么編譯、鏈接、運行的,同時全面介紹C的語法。第 15.1 節(jié)改編自林小竹老師的講義,第 25.1 節(jié)和第 25.2 節(jié)改編自朱仲濤老師的講義,第 17 章改編自參考文獻[2]?! ∵@本書定位在入門級,雖然內(nèi)容很多,但不是一本百科全書,除了把C語言基本講透了之外其他內(nèi)容都不深入,書中列出了很多參考文獻,是讀者進一步學習的起點。K&R的第1章是一個Whirlwind Tour,把全書的內(nèi)容簡單過一遍,然后再逐個深入講解。本書也可以看作是計算機專業(yè)課程體系的一個Whirlwind Tour,學完之后讀者有了一個全局觀,再去學習本書所列的參考文獻就應該很容易上手了?! ∮械脑u論者批評我這本書是“滿漢全席(暗含的意思就是這一本就行了)”,什么都想講,什么都講不細,不符合UNIX的哲學(Do one thing, do it well),我必須要反駁一下了。設(shè)想有一個菜鳥,對學習計算機技術(shù)非常有熱情,卻不知從何處入手,于是去請教一個牛人,這個牛人就是批評我的那個評論者,以他的風格一定會給這個菜鳥推薦一個書單子(或許和本書的參考書目差不多吧),然后對菜鳥說:Study each book, study it well.如果這個菜鳥來請教我,我會首先推薦他看這本書,然后對他說:看完這本書只是一個開始,以后的路還長著呢,但我相信你看完這本書就知道以后該看什么書,而不需要再問別人了?! 槭裁匆贚inux平臺上學C語言? 用Windows學C語言不好嗎? 用Windows還真的是學不好C語言。C語言是一種面向底層的編程語言,要寫好C程序,必須對操作系統(tǒng)的工作原理非常清楚,因為操作系統(tǒng)也是用C寫的,我們用C寫應用程序直接使用操作系統(tǒng)提供的接口。Linux是一種開源的操作系統(tǒng),你有任何疑問都可以從源代碼和文檔中找到答案,即使你看不懂源代碼也找不到文檔,也很容易找個高手教你,各種郵件列表、新聞組和論壇上從來都不缺樂于助人的高手;而Windows是一種封閉的操作系統(tǒng),除了微軟的員工別人都看不到它的源代碼,只能通過文檔去猜測它的工作原理,更糟糕的是,微軟向來喜歡藏著掖著,好用的功能留著自己用,而不會寫到文檔里公開。 Windows平臺上的開發(fā)工具往往和各種集成開發(fā)環(huán)境(Integrated Development Environment,IDE)綁在一起,例如Visual Studio、Eclipse等。使用IDE確實很便捷,但IDE對于初學者絕對不是好東西。微軟喜歡宣揚傻瓜式編程的理念,告訴你用鼠標拖幾個控件然后單擊一個按鈕就可以編譯出程序來,但是真正有用的程序有哪個是這么拖出來的?很多從Windows平臺入門學編程的人,編了好幾年程序,還是只知道編完程序單擊一個按鈕就可以跑了,把幾個源文件拖到一個項目里就可以編譯到一起了,如果有更復雜的需求他們就傻眼了,因為他們腦子里只有按鈕、菜單的概念,根本沒有編譯器、鏈接器、Makefile的概念,甚至連命令行都沒用過,然而這些都是初學編程就應該建立起來的基本概念。另一方面,編譯器、鏈接器和C語言的語法有密切的關(guān)系,不了解編譯器、鏈接器的工作原理就不可能真正掌握C的語法。所以,IDE并沒有幫助你學習,反而阻礙了你學習,本來要學好C編程只要把語法和編譯命令學會就行了,現(xiàn)在有了IDE,除了學會語法和編譯命令,你還得弄清楚編譯命令和IDE是怎么集成的,這才算學明白了,本來就很復雜的學習任務被IDE搞得更加復雜了。Linux用戶的使用習慣從來都是以敲命令為主,以鼠標操作為輔,從學編程的第一天起就要敲命令編譯程序,等到你把這些基本概念都搞清楚了,你覺得哪個IDE好用你再去用,不過到那時候你可能會更喜歡vi或emacs而不是IDE了。 有的讀者目前只會用Windows系統(tǒng), 但想學習C編程,能否從本書學起? 為了照顧只會用Windows系統(tǒng)的讀者,我也會介紹Windows下的C開發(fā)環(huán)境,本書絕大多數(shù)程序只使用標準C的語法和庫函數(shù),在Windows上也可以編譯運行,但是有關(guān)調(diào)試、操作系統(tǒng)原理和鏈接原理的章節(jié)則完全以Linux系統(tǒng)為背景來講解,Windows平臺上的鏈接和調(diào)試相關(guān)知識可以參考電子工業(yè)出版社出版的《軟件調(diào)試》和《程序員的自我修養(yǎng)——鏈接、裝載與庫》。總之,除了第 10 章、第 17 章、第 18 章、第 19 章、第 21 章之外,本書其他章節(jié)都可以在Windows平臺上學習?! ”緯恰禠inux C編程一站式學習》的升級版, 它和前一版有什么不同? 自《Linux C編程一站式學習》出版以來,我收到了很多讀者反饋,讓我意識到很多地方寫得還不到位,所以決定修訂和再版。我認為寫一本書應該是一個持續(xù)改進的過程,一旦停筆,這本書也就失去了生命力。所以這次修訂也不會是最終版本,只要還有不十分滿意的地方,日后我還會繼續(xù)修訂下去。 本書相對于前一版的改動僅限于局部細節(jié),已經(jīng)買過前一版的讀者朋友可以不必購買本書。很多讀者期望本書網(wǎng)絡(luò)版中的Linux系統(tǒng)編程部分也能修訂出版,很遺憾的是目前我還沒有精力修訂那一部分。下一步計劃可能會把Linux系統(tǒng)編程部分單獨成書出版,但請不要抱有期望,寫書畢竟不是我生活的主線,只是業(yè)余的、興趣驅(qū)動的和半公益性質(zhì)的活動,請讀者朋友們諒解?! ”緯鄬τ谇耙话娴母倪M主要有以下幾方面?! ”緯且槐綜語言教材而不是Linux教材,事實上絕大部分章節(jié)是平臺無關(guān)的,上一版過于強調(diào)Linux平臺,使很多Windows平臺的初學者錯過了本書。我已經(jīng)知錯了,特將書名中的Linux字眼去掉,并且在書中補充介紹了Windows下的C開發(fā)環(huán)境。 本書是一本C語言教材而不是嵌入式開發(fā)教材,一些培訓公司的市場宣傳給很多初學者植入了錯誤的觀念,比如“只有嵌入式開發(fā)才用C語言,做別的開發(fā)不需要學C語言”。本書的上一版很不幸地歸類在“嵌入式技術(shù)叢書”里,為避免強化嵌入式和C語言之間的錯誤關(guān)聯(lián),也為了避免讀者誤以為本書是培訓公司用剪刀漿糊拼湊出來的Yet another嵌入式教材,本書不再歸類于“嵌入式技術(shù)叢書”?! ‰m然我在上一版中信誓旦旦地說這是一本面向完全零基礎(chǔ)讀者的書,但現(xiàn)實教育了我,要寫出一本讓任何零基礎(chǔ)讀者都看得懂的書是一門復雜的系統(tǒng)工程,我只能努力接近這個目標,而永遠達不到這個目標。感謝我老婆桃子和我表弟大鵬,他們作為真正的零基礎(chǔ)讀者仔細Review了我的書,尤其桃子還是一個文科生,她每次給我指出的問題都完全出乎我的意料 ——原來還有人會這么理解啊,原來還有人用這樣的思維方式啊。經(jīng)過一番修訂之后,現(xiàn)在我還是要說這是一本面向完全零基礎(chǔ)讀者的書,至少我一直是朝這個目標努力的?! ⌒拚俗x者指出的一些小錯誤和不恰當?shù)谋磉_,有些地方闡釋得不夠我又加了些筆墨,有些技術(shù)細節(jié)改用更好的實現(xiàn)方式,比如重寫了第 21.4 節(jié),我認為現(xiàn)在用的方法比上一版要好。
內(nèi)容概要
本書有兩條線索,一條線索是以Linux 平臺為載體全面深入地介紹C 語言的語法和程序
的工作原理,另一條線索是介紹程序設(shè)計的基本思想和開發(fā)調(diào)試方法。本書分為兩部分:
第一部分講解編程語言和程序設(shè)計的基本思想方法,讓讀者從概念上認識C語言;第二部分
結(jié)合操作系統(tǒng)和體系結(jié)構(gòu)的知識講解程序的工作原理,讓讀者從本質(zhì)上認識C 語言。
本書適合做零基礎(chǔ)的初學者學習C語言的第一本教材,幫助讀者打下牢固的基礎(chǔ)。有一定的編程經(jīng)驗但知識體系不夠完整的讀者也可以對照本書查缺補漏,從而?深入地理解程序的工作原理。本書最初是為北京亞嵌教育研究中心的嵌入式Linux系統(tǒng)工程師就業(yè)班課程量身定做的教材之一,也適合作為高等院校程序設(shè)計基礎(chǔ)課程的教材。本書對于C語言的語法介紹得非常全面,對C99標準做了很多解讀,因此也可以作為一本精簡的C語言語法參考書。
作者簡介
宋勁杉,亞嵌教育資深講師,清華大學自動化系碩士,6年嵌入式系統(tǒng)開發(fā)經(jīng)驗,3年嵌入式行業(yè)教學經(jīng)驗,精通Linux內(nèi)核、POSIX、TCP/IP,擅長ARM平臺的Linux系統(tǒng)移植和應用開發(fā),目前關(guān)注的方向有分布式系統(tǒng)、動態(tài)語言。愛好:開源軟件、電子音樂、HomeParty。
書籍目錄
上篇 C語言入門
第1章 程序的基本概念
1.1 程序和編程語言
1.2 自然語言和形式語言
1.3 程序的調(diào)試
1.4 第一個程序
第2章 常量、變量和表達式
2.1 繼續(xù)Hello World
2.2 常量
2.3 變量
2.4 賦值
2.5 表達式
2.6 字符類型與字符編碼
第3章 簡單函數(shù)
3.1 數(shù)學函數(shù)
3.2 自定義函數(shù)
3.3 形參和實參
3.4 全局變量、局部變量和作用域
第4章 分支語句
4.1 if語句
4.2 if/else語句
4.3 布爾代數(shù)
4.4 switch語句
第5章 深入理解函數(shù)
5.1 return語句
5.2 增量式開發(fā)
5.3 遞歸
第6章 循環(huán)語句
6.1 while語句
6.2 do/while語句
6.3 for語句
6.4 break和continue語句
6.5 嵌套循環(huán)
6.6 goto語句和標號
第7章 結(jié)構(gòu)體
7.1 復合類型與結(jié)構(gòu)體
7.2 數(shù)據(jù)抽象
7.3 數(shù)據(jù)類型標志
7.4 嵌套結(jié)構(gòu)體
第8章 數(shù)組
8.1 數(shù)組的基本概念
8.2 數(shù)組應用實例:統(tǒng)計隨機數(shù)
8.3 數(shù)組應用實例:直方圖
8.4 字符串
8.5 多維數(shù)組
第9章 編碼風格
9.1 縮進和空白
9.2 注釋
9.3 標識符命名
9.4 函數(shù)
9.5 indent工具
第10章 gdb
10.1 單步執(zhí)行和跟蹤函數(shù)調(diào)用
10.2 斷點
10.3 觀察點
10.4 段錯誤
第11章 排序與查找
11.1 算法的概念
11.2 插入排序
11.3 算法的時間復雜度分析
11.4 歸并排序
11.5 線性查找
11.6 折半查找
第12章 棧與隊列
12.1 數(shù)據(jù)結(jié)構(gòu)的概念
12.2 堆棧?
12.3 深度優(yōu)先搜索
12.4 隊列與廣度優(yōu)先搜索
12.5 環(huán)形隊列
本階段總結(jié)
下篇 C語言本質(zhì)
附錄A 字符編碼
參考文獻
索引
編輯推薦
暢銷書升級版 手把手教你將四年的任務用四個月做好 以C語言為載體,系統(tǒng)講述計算機原理和程序原理 從零基礎(chǔ)開始學習編程,內(nèi)容涵蓋C語言入門及C語言本質(zhì)
圖書封面
圖書標簽Tags
無
評論、評分、閱讀與下載