導航:首頁 > 編程語言 > linux一站式編程答案

linux一站式編程答案

發布時間:2024-07-14 13:34:33

linuxC編程一站式學習的前 言

本書最初是為北京亞嵌教育研究中心的嵌入式Linux系統工程師就業班課程量身定做的教材之一。該課程是為期四個月的全日制職業培訓,要求學員畢業時具備非常Solid的C語言編程能力,能熟練地使用Linux系統,同時對計算機體系結構與指令集、操作系統原理和設備驅動程序都有比較深入的了解。然而學員入學時的水平是非常初級而且參差不齊的:學歷有專科、本科也有研究生;專業有和計算機相關的,也有很不相關的(例如會計專業);以前從事的職業有和技術相關的也有完全不相關的(例如HR);年齡從二十歲出頭到三十五六歲的都有。這么多背景、基礎、思維習慣和理解能力完全不同的人來聽同一堂課,大家都迫切希望學會嵌入式開發技術,投身IT行業,這就是職業教育的特點,也是我編寫本書時需要考慮的主要問題。
學習編程絕不是一件簡單的事,尤其是對於零基礎的初學者來說。大學的計算機專業有四年時間從零基礎開始培養一個人,微積分、線性代數、概率論、離散數學、組合數學、自動機、編譯原理、操作系統、計算機組成原理等一堆基礎課,再加上C/C++、Java、資料庫、網路工程、軟體工程、計算機圖形學等一堆專業課,最後培養出一個能找到工作的學生。很遺憾這最後一條很多學校沒有做好,據我們考查,來亞嵌培訓的很多學生基礎幾乎為零,我不知道為什麼。與之形成鮮明對比的是,只給我們四個月的時間,同樣要求從零基礎開始,最後培養出一個能找到工作的學生,而且還要保證他找到好工作,這就是職業教育的特點。
為什麼我說「只給我們四個月的時間」?我們倒是想教四年呢,但學時的長短我們做不了主,是由市場規律決定的。四年的任務要求四個月做好,要怎麼完成這樣一個幾乎不可能的任務呢?有些職業教育給出的答案是「實用主義」,打出了「有用就學,沒有用就不學」的口號,大肆貶低說大學里教的基礎課都是過時的、無用的,只有他們教的技術才是實用的。這種炒作很不好,我認為大學里教的每一門課都是非常有用的,基礎知識在任何時候都不會過時,倒是那些時髦的「實用技術」有可能很快就會過時了。
四年的任務怎麼才能用四個月做好?我們給出的答案是「優化」。現在大學里安排的課程體系最大的缺點就是根本不考慮優化。每個過來人都會有這樣的感覺:大一大二學了好多數學課,卻不知道都是干什麼用的,不明白為什麼要學。連它有什麼用都不知道怎麼能有興趣學好呢?到大三大四學專業課時,用到以前的知識了,才發現以前學的數學是多麼有用,然而早就忘得一干二凈了,考完試都還給老師了。回頭重新學,才發現很多東西以前根本沒學明白,現在真的學明白了,那麼前兩年的時間豈不是都浪費了?大學里的課程體系還有一個缺點就是不靈活,每門課必須佔用一個學期,必須由一個老師教,不同課程的老師之間沒有任何溝通和銜接,其實這些課程之間是相互依賴的,把它們強行拆開是不符合人的認知規律的。比如我剛上大學的時候,大一上半學期就被逼著學習C語言,其實C語言是一門很難的編程語言,不懂編譯原理、操作系統和計算機體系結構根本不可能學明白,那半個學期自然就浪費掉了。當時幾乎所有學校的計算機相關專業都是這樣,大一剛來就學C語言,有的學校更瘋狂,上來就學C++,導致大多數學生都以為自己會C語言,但其實都是半吊子水平,到真正寫代碼的時候經常為一個Bug搞得焦頭爛額,卻沒有機會再系統地學一遍C語言。因為在學校看來,C語言早在大一就給你「上完了」,就像一頓飯已經吃完了,不管你吃飽沒吃飽,不會再讓你重吃一遍了。顯而易見,如果要認真地對這些課程進行優化,的確是有很多水分可以擠的。
本書有什麼特點
 本書不是孤立地講C語言,而是和編譯原理、操作系統、計算機體系結構結合起來講。或者說,本書的內容只是以C語言為載體,真正講的是計算機和程序的原理。
 強調基本概念和基本原理,在編排順序上重視概念之間的依賴關系,每次引入一個新的概念,只依賴於前面章節已經講過的概念,而絕不會依賴於後面章節要講的概念。有些地方為了敘述得完整,也會引用後面要講的內容,比如說「有關××我們到第×章再仔細講解」,凡是這種引用都不是必要的依賴,可以當它不存在,只管繼續往下學習就行了。
 盡量做到每個知識點直到要用的時候才引入。過早引入一個知識點,講完了又不用它,讀者很快就會遺忘,這是不符合認知規律的。
本書面向什麼樣的讀者
這是一本從零基礎開始學習編程的書,不要求讀者有任何編程經驗,但讀者至少需要具備以下素質:
 熟悉Linux系統的基本操作。如果不具備這一點,請先參考其他教材學習相關知識,熟練之後再學習本書,《鳥哥的Linux私房菜》據說是Linux系統管理和應用方面比較好的一本書。但學習本書並不需要會很多系統管理技術,只要會用基本命令、會自己安裝系統和軟體包就足夠了。
 具有高中畢業的數學水平。本書會用到高中的數學知識。事實上,如果不具有高中畢業的數學水平,也不必考慮做程序員了。但並不是說只要具有高中畢業的數學水平就足夠做程序員了,只能說看這本書應該沒有問題,數學是程序員最重要的修養,計算機科學其實就是數學的一個分支,如果你的數學功底很差,日後還需要惡補一下。
 具有高中畢業的英文水平。理由同上。
 對計算機的原理和本質深感興趣,不是為就業而學習,不是為拿高薪而學習,而是真的感興趣,想把一切來龍去脈搞得清清楚楚而學習。
 勤於思考。本書盡最大努力理清概念之間的依賴關系,力求一站式學習,讀者不需要為了找一個概念的定義去翻閱其他書籍,也不需要為了搞清楚一個概念在本書中亂翻一通,只需要從前到後按順序學習即可。但一站式學習並不等於傻瓜式學習,有些章節有一定的難度,需要讀者積極思考才能領會。本書可以替你節省時間,但不能替你思考,不要指望像看小說一樣走馬觀花看一遍就能學會。
為什麼要學這本書而不是K&R
《The C Programming Language》(後文簡稱[K&R])是公認的世界上最經典的C語言教程之一,這點毫無疑問。在C標准出台之前,K&R第一版就是事實上的C標准。C89標准出台之後,K&R跟著推出了第二版,可惜此後就沒有更新過了,所以不能反映C89之後C語言的發展以及最新的C99標准。本書在這方面做了很多補充。本書與其說是講C語言,不如說是以C語言為載體講計算機和操作系統的原理,而K&R只是為了講C語言而講C語言,側重點不同,內容編排也很不相同。K&R寫得非常好,代碼和語言都非常簡潔,但很可惜,只有會C語言的人才懂得欣賞它,K&R是非常不適合入門學習的,尤其不適合零基礎的學生學習。
本書「是什麼」和「不是什麼」
本書包括兩大部分:
 C語言入門。介紹基本的C語法,幫助沒有任何編程經驗的讀者理解什麼是程序以及怎麼寫程序,培養程序員的思維習慣,找到編程的感覺。前半部分改編自《How To Think Like A Computer Scientist: Learning with C++》(後文簡稱[ThinkCpp])。
 C語言本質。結合計算機和操作系統的原理講解C程序是怎麼編譯、鏈接、運行的,同時全面介紹C的語法。位運算的章節改編自林小竹老師的講義;鏈表和二叉樹的章節改編自朱仲濤老師的講義;匯編語言的章節改編自《Programming from the Ground Up: An Introction to Programming using Linux Assembly Language》(後文簡稱[GroundUp]),在該書的最後一章中提到,學習編程有兩種Approach,一種是「Bottom Up」,一種是「Top Down」,它們各有優缺點,而我們需要將兩者結合起來。所以我編寫本書的思路是:第一部分Top Down;第二部分Bottom Up;第三部分可以算填補了中間的空隙,三部分全都圍繞C語言展開。
這本書定位在入門級,雖然內容很多,但不是一本網路全書,除了C語言的基礎知識要講透之外其他內容都不深入,書中列出了很多參考資料,是讀者進一步學習的起點。[K&R]的第1章是一個Whirlwind Tour,把全書的內容簡單概括了一遍,然後再逐個深入講解。本書也可以看作是計算機專業課程體系的一個Whirlwind Tour,學習完本書之後讀者有了一個全局觀,再去學習那些參考資料就應該很容易上手了。
為什麼要在Linux平台上學C語言?
用Windows學C語言不好嗎?
用Windows還真的是學不好C語言。C語言是一種面向底層的編程語言,要寫好C程序,必須對操作系統的工作原理非常清楚,因為操作系統也是用C語言編寫的,我們用C語言編寫應用程序可以直接使用操作系統提供的介面。既然你選擇了本書,你一定了解:Linux是一種開源的操作系統,你有任何疑問都可以從源代碼和文檔中找到答案,即使你看不懂源代碼,也找不到文檔,也很容易找個高手教你,各種郵件列表、新聞組和論壇上從來都不缺樂於助人的高手;而Windows是一種封閉的操作系統,除了微軟的員工別人都看不到它的源代碼,只能通過文檔去猜測它的工作原理。更糟糕的是,微軟向來喜歡藏著掖著,好用的功能留著自己用,而不會寫到文檔里公開。本書的第一部分在Linux或Windows平台上學習都可以,但第二部分和第三部分介紹了很多Linux操作系統的原理以幫助讀者更深入地理解C語言,所以後兩部分只能在Linux平台上學習。
Windows平台上的開發工具往往和各種集成開發環境(Integrated Development Environment,IDE)綁在一起,例如Visual Studio、Eclipse等。使用IDE確實很便捷,但IDE對於初學者絕對不是好東西。微軟喜歡宣揚傻瓜式編程的理念,告訴你用滑鼠拖幾個控制項,然後單擊一個按鈕就可以編譯出程序來,但是真正有用的程序有哪個是這么拖出來的?很多從Windows平台入門學編程的人,編了好幾年程序,還是只知道編完程序單擊一個按鈕就完事了,把幾個源文件拖到一個項目里就可以編譯到一起了,如果有更復雜的需求他們就傻眼了,因為他們腦子里只有按鈕、菜單的概念,根本沒有編譯器、鏈接器、Makefile的概念,甚至連命令行都沒用過,然而這些都是初學編程就應該建立起來的基本概念。另一方面,編譯器、鏈接器和C語言的語法有著密切的關系,不了解編譯器、鏈接器的工作原理,也不可能真正掌握C語言的語法。所以,IDE並沒有幫助你學習,而是阻礙了你的學習,本來要學好C編程只要把語法和編譯命令學會就行了,現在有了IDE,除了學會語法和編譯命令,你還得弄清楚編譯命令和IDE是怎麼集成的,這才算學明白了,本來就很復雜的學習任務被IDE搞得更加復雜了。Linux用戶的使用習慣從來都是以敲命令為主,以滑鼠操作為輔,從學編程的第一天起就要敲命令編譯程序,等到你把這些基本概念都搞清楚了,你覺得哪個IDE好用你再去用,不過到那時候你可能會更喜歡vi或emacs而不是IDE了。
體例說明
像The quick brown fox jumps over the lazy dog這樣的字體在本書中是代碼字體。這種字體的名稱是Dejavu Sans Mono,為什麼我要提倡用這種字體呢?第一,它是等寬字體,因此適合做代碼字體。第二,它的1和l、0和O區分得非常清楚(我在教學中發現初學者很容易把這些字元抄錯),因此它比Courier New更適合做代碼字體。第三, 它是我的Linux圖形終端的默認字體,採用這種字體排版可以使得看書和看屏幕的感覺很一致,希望讀者在看這本書時也會有這種Dejavu(似曾相識)的感覺。
像下面這樣有邊線的是代碼:
#! /bin/sh
VAR=1
VAR=$(($VAR+1))
echo $VAR
沒有邊線的是終端顯示,包括輸入的命令和程序運行結果,例如:
$ VAR=1
$ VAR=$(($VAR+1))
$ echo $VAR
2
本書中統一用$表示Shell提示符。
加粗的字句表示強調。
在定義一個名詞時會給出它的英文名稱,例如集成開發環境(Integrated Development Environment,IDE),通過書後的索引可以找到這些定義在書中首次出現的位置。
致謝
本書的寫作得到了北京亞嵌教育研究中心的全力支持,尤其感謝李明老師和何家勝老師。沒有公司的支持,我不可能有時間有條件寫這本書,也不可能有機會將這本書公開在網上。
然後要感謝亞嵌教育的歷屆學員和各位老師,在教學和討論的過程中我經常會得到有益的啟發,這些都促使本書更加完善。在本書的寫作過程中,很多讀者為本書提出了很有價值的建議,很多建議是熱心網友通過在線評論提出的,有些網友我只知道ID或E-mail。在此向他們表示感謝。
感謝幫助過我的老師們:李明、何家勝、邸海霞、郎鐵山、朱仲濤、廖文江、韓超、秦蔚、吳岳、張 、邢文鵬、何曉龍、林小竹、衛劍釩、郭同彬、王波、王磊。
感謝熱心網友:ddd、wuyulei、commapopo、田偉、田雨、daidai、鄧楠、杜朴風、Zoom.Quiet、陳莉君老師、楊景、章鈺、chen、Jiawei Zhang、waterloo、張現超、曾宇、董俊波、RobinXiang、劉艷明、been2100、cleverd、juicerococo、徐斌、cyy、Linux_Xfce、馮海雲、侯延祥、churchmice、codycody23、syfeagle、王公僕、劉敏、Laciq、yuchen、陸楊、陳楊希、love_wc3、姚磊、芝麻、wadenx、沈震、sunbingfly、mick、baaluck、曹帥軍、zhoudy、朱夜光、刺蝟、leezhenfeng、王兆宏、徐凱、碼匠、況海斌、尹志偉、王星。
還要感謝電子工業出版社博文視點資訊有限公司的周筠老師和李冰老師的大力支持,感謝江立編輯嚴謹細致的工作。
在寫作過程中我遇到過很多困難:工作繁忙、對未來迷茫、生活壓力大、缺乏安全感、個人瑣事等。然而有這么多熱心的同學、老師、朋友、網友在等著閱讀我的書在線更新的內容,給我提建議,希望我把書改得更完善,這是我堅持寫下去的最大動力。謝謝你們!
由於作者水平十分有限,沒寫過C編譯器和C標准庫,所以疏漏之處在所難免,如有錯誤歡迎廣大讀者朋友批評指正。寫書是一件嚴肅的事,書中的錯誤所有人都看得見,白紙黑字賴不掉的。我教過的很多學生都在大學里學過C語言,甚至考過二級,但程序寫得一塌糊塗,連最基本的概念都搞錯了,以前學過的C語言教材中的錯誤在他們腦子里根深蒂固,即使我糾正多次,他們仍然只記得以前學過的錯誤概念。這種有基礎的學生還不如沒有任何基礎的學生教起來容易。我非常害怕我教給別人的知識也是錯的,所以我仔細研究了C99之後才敢動筆寫書。這本書涵蓋的話題比較廣泛,我竭盡全力也不足以保證書中的內容全部正確,還要依靠社區的力量一起來完善這本書,這樣才能真正對讀者負責,所以我選擇將這本書開源。。
希望本書能成為你求學道路上的第一個夥伴。
宋勁杉
2009年7月22日

② 鏈夊摢浜沜璇璦鐩稿叧涔︾睄鎺ㄨ崘錛

鎺㈢儲C璇璦鐨勪笘鐣岋紝浠庡叆闂ㄥ埌榪涢樁鐨勫繀璇諱功鍗


鍩虹綃


鎯寵佸紑鍚疌璇璦涔嬫棶錛岃繖浜涗功綾嶆槸浣犱笉鍙鎴栫己鐨勫紩瀵艱咃細



榪涢樁綃


鎻愬崌鎶鑳斤紝浣犻渶瑕佽繖浜涜繘闃朵功綾嶆潵鎸戞垬鑷鎴戱細



綆楁硶涓庢暟鎹緇撴瀯綃


鎻愬崌綆楁硶鑳藉姏錛岃繖浜涗功綾嶄笉鍙鎴栫己錛



緇х畫娣卞叆錛Linux緙栫▼璁╀綘鍦ㄥ疄闄呯幆澧冧腑紓ㄧ偧鎶宸э細



宓屽叆寮忓紑鍙戠瘒


鎺㈢儲宓屽叆寮忎笘鐣岀殑閬撹礬錛



瀹炴垬綃


閫氳繃瀹為檯欏圭洰錛屾彁鍗囩紪紼嬪疄鎴樿兘鍔涳細



棰濆栨帹鑽



閫夋嫨閫傚悎鑷宸辯殑涔︾睄錛岃笍涓奀璇璦鐨勬帰緔涔嬫棶錛屾ユヤ負钀ワ紝涓嶆柇鎻愬崌緙栫▼鎶鑳藉惂錛

③ 鍏充簬linux gcc c89 c99鐨勯棶棰

瀵癸紝C99鐨勬柊鐗規у厑璁稿湪鏁扮粍闀垮害琛ㄨ揪寮忎腑浣跨敤鍙橀噺錛岀О涓哄彉闀挎暟緇勶紙VLA錛孷ariable Length Array錛夛紝VLA鍙鑳藉畾涔変負灞閮ㄥ彉閲忚屼笉鑳芥槸鍏ㄥ矓鍙橀噺錛屼笌VLA鏈夊叧鐨勮娉曡勫垯姣旇緝澶嶆潅錛岃屼笖寰堝氱紪璇戝櫒涓嶆敮鎸佽繖縐嶆柊鐗規э紝鎵浠ヨ繕鏄涓嶅緩璁浣跨敤鐨勩

璇磋翠綘榪欎釜渚嬪瓙鍚э紝浣犺繖涓鍏跺疄涓嶅睘浜庡彉闀挎暟緇勶紝鍥犱負鍦ㄥ畾涔夋暟緇 arr[] 鍓嶏紝瀹冪殑澶у皬 var 宸茬粡鏄鍥哄畾鐨勪簡銆傚簲璇ユ槸榪欐牱錛
int var;
int arr[var];
鍏堜笉瑕佸垵濮嬪寲鍙橀噺 var銆

鎴戝啀緇欎釜渚嬪瓙鍚э紝銆奓inux C緙栫▼涓絝欏紡瀛︿範銆嬮噷闈㈠叧浜庡綊騫舵帓搴忕畻娉曠殑鍏朵腑涓涓鍑芥暟銆
void merge(int start, int mid, int end)
{
int n1 = mid - start + 1;
int n2 = end - mid;
int left[n1], right[n2];
......
}
鍏朵腑錛宭eft涓巖ight閮芥槸鍙橀暱鏁扮粍錛屽洜涓哄湪瀹氫箟鐨勬椂鍊欙紝鏁扮粍澶у皬涓嶇『瀹氥

④ linux涓絝欏紡緙栫▼linux涓絝欏紡

linuxc涓絝欏紡緙栫▼濂界敤鍚楋紵

璇村疄璇濅笉澶濂界敤錛屾病鏈夎嚜甯︾殑緙栬瘧鍣ㄥソ鐢錛屼釜浜鴻傜偣

奼侰璇璦鍒濆﹁呬功綾嶆帹鑽愶紵

鍏堢湅銆奀PrimerPlus涓鏂囩増銆嬶紙濡傛灉浣犺嫳璇濂斤紝鍙浠ョ湅鑻辨枃鐗堛奀PrimerPlus銆嬶級鎺ㄨ崘浠庣粡鍏稿叆鎵嬨傛帹鑽愮殑璇,榪欐湰涔︿笂鐨勪範棰樻槸鏈夌瓟妗堢殑錛屽彲浠ョ粌緇冦

濡傛灉鐫鎬ョ殑璇濆彲浠ョ湅璋嫻╁己鐨勩奀璇璦紼嬪簭璁捐°嬶紝鐪嬪畬鍩烘湰灝忕▼搴忎細鍐欙紝綆楀叆闂ㄤ簡銆

榪涢樁鐨勪功鍘葷湅銆奣heCProgrammingLanguage銆嬶紝淇楃ОC璇璦鍦g粡銆

鍐嶈繘涓姝ュ氨鏄澶氬啓浠g爜鐨勭粡楠屽拰鏍規嵁闇瑕佸︿範鐩稿簲鐨凜璇璦錛堟瘮濡侽bject鈥擟錛屽啓AppleApp鐢ㄧ殑錛

鑷充簬浣犻夌殑鍏朵粬鐨勪功閮藉彲浠ュ厛涓嶇湅錛屽叾涓銆21澶╁﹂歝錛堢涓夌増錛夈嬨奀璇璦緙栫▼瀹濆吀銆嬨婁綘蹇呴』鐭ラ亾鐨495涓狢璇璦闂棰樸嬪熀鏈鏄鐢ㄦ潵璇撻獥鏂版墜鐨勫晢涓氫功錛屽櫛澶存瘮杈冮噸錛屾湁鐢ㄧ殑涓嶅氾紝閲嶅嶆у緢楂樸

銆奀鍜屾寚閽堛嬨奀闄烽槺涓庣己闄楓嬫槸姣旇緝濂界殑涔︼紝浣嗘槸鏈夌偣楂橀樁浜嗭紝濡傛灉涓嶆槸鐮旂┒C璇璦鐨勮瘽鍩烘湰涓婄敤涓嶅埌錛岄櫎闈炴槸鍏鍙擱噷鐨凜璇璦宸ョ▼甯堟墠鐪嬨

閱讀全文

與linux一站式編程答案相關的資料

熱點內容
手機系統源碼什麼意思 瀏覽:167
繁體pdf轉簡體 瀏覽:652
雲伺服器更改時間 瀏覽:993
解壓球怎麼過 瀏覽:677
時間伺服器埠為什麼要123 瀏覽:363
思科帶寬配置的命令 瀏覽:54
壓縮模量孔隙比 瀏覽:692
安卓開發如何分析日誌 瀏覽:878
單片機編程小燈 瀏覽:276
oppor9s怎麼給軟體加密 瀏覽:37
java技術平台 瀏覽:184
福昕pdf合成 瀏覽:205
命令性幻聽需要治幾年 瀏覽:866
docker安裝phpfpm 瀏覽:513
智能程序員入門教程 瀏覽:699
長興製作個人網站用什麼app 瀏覽:588
夜晚解壓方式 瀏覽:52
python判斷類型dict 瀏覽:961
設計加密系統示意圖 瀏覽:536
思譯是什麼app 瀏覽:665