Linux下如何學習C語言
儘管C 語言問世已近 0 年,但它的魅力仍未減退。C 語言繼續吸引著眾多的開發者,他們為了編寫、移植或維護應用程式而必須學習新技能。下面是小編為大家帶來的關於Linux下如何學習C語言的知識,歡迎閱讀。
引言
儘管 C 語言問世已近 30 年,但它的魅力仍未減退。C 語言繼續吸引著眾多的開發者,他們為了編寫、移植或維護應用程式而必須學習新技能。
本文是為了滿足對C語言初學者或想提高自身C語言修為的開發人員的需要而寫的。希望對您的學習和工作有所幫助。您也許不贊同其中的某些方法,但我們希望您會喜歡其中的一些。
本文不介紹作為一個程式設計師應掌握得語言細節,而是與初學者分享自己的UNIX 下C語言程式設計學習經驗;也不說明一個合格的程式設計人員應該掌握的計算機知識,比如:作業系統、資料結構與演算法、資料庫等等。
不管您出於什麼目的,希望您閱讀完本文後能留下您的批評或建議。您的中肯的批評會成為作者前進的動力。
工具篇
“公欲善其事,必先利其器”。程式設計是一門實踐性很強的工作,在你以後的學習或工作中,你將常常會與以下工具打交道, 下面列出學習C語言程式設計常常用到的軟體和工具。
(一) 操作系統
在UNIX或Linux系統中學習C很方便,所以在開始您的學習旅程前請先選擇一個UNIX或Linux作業系統。
目前可供個人免費使用的UNIX或Linux系統有FreeBSD、CentOS、Ubuntu、SUSE Linux等,如果你以前沒有接觸過UNIX或Linux選擇Ubuntu還是比較好,因為它的軟體非常豐富,當然瞭如果你想以後一直在Linux工作學習建議選擇CentOS,而且在安裝包中還提供很多實用的工具,如:gcc, make等。
如果您一直使用Windows,身邊又沒有多餘的機器安裝UNIX,則可以使用VMware,通過VMware安裝虛擬系統。
(二) 編譯工具
目前絕大多數Unix或Lnux系統都提供CC或GCC編譯器,最簡單的cc命令格式如下:
cc -o hello hello.c
在unix shell環境中敲入上面的程式碼會將hello.c程式編譯成可執行檔案hello。
make 工具如 GNU make、System V make 和 Berkeley make 是用來組織應用程式編譯過程的`基本工具,但是每個 make 工具之間又有所不同。
大部分UNIX和Linux程式都是通過執行make來編譯的。make工具會讀取一個包含指令的檔案(這個檔案的名字通常都是 makefile 或 Makefile,不過後文中我們統一稱之為 “makefile”),並執行各種操作來編譯程式
(三) 除錯工具
最簡單的除錯工具:為你的程式新增列印語句
在你對程式的執行機制有了一定的瞭解後,你可以實用一些工具幫助你進行除錯,當然你得學習一下這些工具得使用,如:dbx,gdb等。
還有一些記憶體工具可以幫你查詢記憶體洩漏或緩衝區溢位等一些問題,如:memwatch,yamd等
(四) 其他工具
或vim(vim是vi的升級版)
Unix下文字編輯器。主要靠一堆命令來編輯文字檔案,學Unix程式設計最好熟悉並熟練使用vi編輯器。
當然在實際工作中,你可能需要一個整合編碼環境或一個功能強大的圖形化編輯工具。
erm
最著名的網路終端軟體之一,可以使用它方便的連線到主機系統中。
re shell
一個支援ssh協議得客戶端工具,多數情況下用來連線linux系統。
書籍篇
“書是人類進步得階梯”。學習一門新的知識,當然要選擇幾本適合自己得書籍,下面介紹一些我自己學習C語言使用過的書籍:
1.《C primer plus》
推薦理由:適合作為入門書和基本函式查詢得參考資料。本書最新版為第五版,以ANSI C99為標準詳細介紹了C語言。
2.《The C programming_Language》
推薦理由:C語言之父得作品權威性毋庸置疑。雖然書籍出版時間比較老,好像也沒更新,不過仍不失為經典書籍,網上有這本書得英文電子版提供下載。
3.《C 專家程式設計》
推薦理由:本書可以幫助有一定經驗的C程式設計師成為C程式設計方面的專家,最關鍵的是本書寓教於樂,讓你充分享受程式設計的樂趣。
4.《C缺陷與陷阱》
推薦理由:書中所揭示的知識能幫助您繞過C語言自身得陷阱和缺陷,減少程式碼中許多常見的Bug。
5.《unix環境高階程式設計》
推薦理由:既然是UNIX環境下C程式設計,就不得不說說UNIX程式設計書籍。Stevens先生的《unix環境高階程式設計》是我竭力推薦的,也是我的案頭必備(如果對網路程式設計有興趣的,可以學習一下Stevens先生的《UNIX網路程式設計》兩卷,如果覺得還不過癮,可以再看看《TCP/IP詳解》三卷)。
6.《計算機程式設計藝術》
推薦理由:演算法大師得嘔心瀝血之作。計劃出版五卷書,目前好像已出版3卷。對演算法有興趣得可以研究一下。
過程篇
1. 學習C語法
語法的學習對於一個具有程式設計底子的來說,就很輕鬆了;即使你以前沒有學習過其他程式語言,我相信有2個星期,你也能輕鬆搞定。
需要注意的是,不要太糾纏於語言的細節,比如:運算子優先順序與結合性的問題等。
2. 學習C標準庫
ANSI C庫把函式分為不同的組,每個組都具有與之相關的標頭檔案。C語言標準庫相對於其他語言,比如C++,Java來說是非常短小精悍的,但首先應著重對以下庫進行學習:
ctype.h:字元處理
math.h:數學庫
stdio.h:標準I/O庫
stdlib.h:通用工具庫
string.h:字串處理
time.h:時間和日期
如果想了解完成的ANSI C庫,你可以購買相關的書籍,這些書籍一般會詳細介紹每個函式的使用者和一些注意點。
3.攻克C的難點
C語言宣告:
C語言的聲明確實讓我覺得恐怖,比較晦澀難懂,而且宣告的形式和使用的形式還類似。比如如下的宣告恐怕就連很多熟悉C多年的程式設計師也不是一眼就能看出來的:
char * const * (*next)();
那麼有沒有一種好的記憶方法或規則來搞清楚呢,好像沒有,如果有的話也不是這樣折磨人了。不過可以看看《C專家程式設計》第三章的內容,或許你會有所收穫。也只能多學多練了,所謂熟能生巧嘛,希望這個問題不要在你的心靈上留下陰影。
陣列與指標:
陣列與指標的關係,在標準中並沒有作很詳細的規定,而且好多C入門的書籍在這個問題上並沒有給出很詳細的說明,所以會給人造成很多誤解。
對於這個問題,你可以參考《C缺陷與陷阱》4.5節和《C專家程式設計》第4,9,10章,相信你這裡面的內容搞透徹,以後就不會再被這個問題搞迷惑。
指標與記憶體:
如果你以後編寫規模較大的程式,你可能發現這個問題可能會是你最大的煩惱,而且可能會是你消耗最多除錯時間的事項。
C版本的問題:
你得特別小心該問題,最好不要在你的程式中混合使用不同版本C的特性,否則會給你帶來很迷惑的問題。如果一定要用,你最好清楚自己在做什麼。
還有一些其他C中的難點和容易錯誤的地方,可以學習前人的一些經驗。以下是一個c FAQ的連結地址,相信在這篇文件中有你需要的大部分問題的解決方法。
環境程式設計
學習了以上內容之後,我相信,你就可以進行unix環境程式設計了。不過你可能需要對作業系統理論有一點點的瞭解,這樣學起來會比較輕鬆一些。
Unix環境程式設計,你應該著重IO和程序兩大塊內容。《Unix環境高階程式設計》中對Unix環境程式設計有著非常詳細且深入的論述,而且書中有大量實用性例子程式,不過可能得花上幾個月得時間,好好啃一啃了。
在紮實掌握以上內容,不代表你得C語言學習支路已經完成,相反,才剛剛開始。以後你需要用學到得知識去解決大量不同實際問題,在不斷得實踐過程中,你會近一步加深對C的理解。有了以上基礎之後,你會發現,在實踐過程中需要的其他知識,你會非常快速的掌握。
方法篇
程式設計是一個實踐性很強的工作,最好的學習方法就是邊看書邊除錯程式碼,把書上的例子程式反覆的修改除錯執行,從中得到自己的體會。 在自己的學習或工作中寫的一些測試的程式,要分門別類的儲存下來,在以後的實際工作中不斷的整理,日積月累就是一個很好資源庫了。
有時候,可能會覺得書上的例子作為理解概念時比較通俗易懂,但實用價值不高。所以要提高自己的程式設計能力,你還需要學習別人的程式碼,我認為研究別人的程式碼是提高自己實際程式設計能力最好且最快的途徑,現在網路上有很多價值很高的開原始碼可供你選擇學習。
最後,不得不提到的一個問題就是,千萬不要讓自己淹沒在各種技術細節的海洋中,比如字首++運算子問題,表示式計算優先順序問題等。
學習UNIX下C程式設計也好,還是其他程式語言,我們最後的目標都是為了使用計算機解決現實中的問題,所以積累日常工作中常見問題的解決方法,並形成一定的正規化,做一些提煉才是最重要的。說到底,設計和程式設計所做的事情,就是方法論,不管你是無意識還是有意識的,所以一定要注重積累。
補充說明
1. 對於有人問是否需要一份ANSI C99標準,對於一般開發人員,並沒有必要,且不說其語言晦澀難懂,即使你能從頭到尾學習一遍,我想對你的程式設計也沒有什麼提高。
2.目前多數UNIX作業系統所帶的cc、gcc等編譯器好像並不支援C99的所有新特性,不過現在已經有足夠多的新特性普遍可用,因此有理由開始認真考慮在新的開發中採用C99特性,尤其是用在它們使得效率或清晰度本質上發生變化的那些地方(比如以行內函數代替巨集替換)。
3.程式設計規範的問題:一般較為正規的軟體公司都會有自己的一套完成的程式設計規範,那麼你遵守就好;如果你是自己學習的話,可以選擇一個較為通用的規範,最好的方法就是看別人是怎麼寫程式碼的。