- 論壇徽章:
- 0
|
引言
盡管 C 語言問世已近 30 年,但它的魅力仍未減退。C 語言繼續(xù)吸引著眾多的開發(fā)者,他們?yōu)榱司帉、移植或維護應(yīng)用程序而必須學(xué)習(xí)新技能。
本文是為了滿足對C語言初學(xué)者或想提高自身C語言修為的開發(fā)人員的需要而寫的。希望對您的學(xué)習(xí)和工作有所幫助。您也許不贊同其中的某些方法,但我們希望您會喜歡其中的一些。
本文不介紹作為一個程序員應(yīng)掌握得語言細節(jié),而是與初學(xué)者分享自己的UNIX 下C語言編程學(xué)習(xí)經(jīng)驗;也不說明一個合格的編程人員應(yīng)該掌握的計算機知識,比如:操作系統(tǒng)、數(shù)據(jù)結(jié)構(gòu)與算法、數(shù)據(jù)庫等等。
不管您出于什么目的,希望您閱讀完本文后能留下您的批評或建議。您的中肯的批評會成為作者前進的動力。
工具篇
“公欲善其事,必先利其器”。編程是一門實踐性很強的工作,在你以后的學(xué)習(xí)或工作中,你將常常會與以下工具打交道, 下面列出學(xué)習(xí)C語言編程常常用到的軟件和工具。
(一) 操作系統(tǒng)
在UNIX或Linux系統(tǒng)中學(xué)習(xí)C很方便,所以在開始您的學(xué)習(xí)旅程前請先選擇一個UNIX或Linux操作系統(tǒng)。
目前可供個人免費使用的UNIX或Linux系統(tǒng)有FreeBSD、RedHat Linux、SUSE Linux等,而且在安裝包中還提供很多實用的工具,如:gcc, make等。
如果您一直使用
Windows
,身邊又沒有多余的機器安裝UNIX,則可以使用VMware,通過VMware安裝虛擬系統(tǒng)。
(二) 編譯工具
目前絕大多數(shù)Unix或Lnux系統(tǒng)都提供CC或GCC編譯器,最簡單的cc命令格式如下:
cc -o hello hello.c
在unix shell環(huán)境中敲入上面的代碼會將hello.c程序編譯成可執(zhí)行文件hello。
make 工具如 GNU make、System V make 和 Berkeley make 是用來組織應(yīng)用程序編譯過程的基本工具,但是每個 make 工具之間又有所不同。
大部分UNIX和Linux程序都是通過運行make來編譯的。make工具會讀取一個包含指令的文件(這個文件的名字通常都是 makefile 或 Makefile,不過后文中我們統(tǒng)一稱之為 “makefile”),并執(zhí)行各種操作來編譯程序
(三) 調(diào)試工具
最簡單的調(diào)試工具:為你的程序添加打印語句
在你對程序的運行機制有了一定的了解后,你可以實用一些工具幫助你進行調(diào)試,當(dāng)然你得學(xué)習(xí)一下這些工具得使用,如:dbx,gdb等。
還有一些內(nèi)存工具可以幫你查找內(nèi)存泄漏或緩沖區(qū)溢出等一些問題,如:memwatch,yamd等
(四) 其他工具
1.vi或vim
Unix下文本編輯器。主要靠一堆命令來編輯文本文件,學(xué)Unix編程最好熟悉并熟練使用vi編輯器。
當(dāng)然在實際工作中,你可能需要一個集成編碼環(huán)境或一個功能強大的圖形化編輯工具。
提供一個中文的vim在線手冊:
[url=http://vcd.gro.chttp://vcd.gro.c
linux
.org/
2.netterm
最著名的網(wǎng)絡(luò)終端軟件之一,可以使用它方便的連接到主機系統(tǒng)中。
3.Secure shell
一個支持ssh
協(xié)議
得客戶端工具,多數(shù)情況下用來連接linux系統(tǒng)。
書籍篇
“書是人類進步得階梯”。學(xué)習(xí)一門新的知識,當(dāng)然要選擇幾本適合自己得書籍,下面介紹一些我自己學(xué)習(xí)C語言使用過的書籍:
1.《C primer plus》
推薦理由:適合作為入門書和基本函數(shù)查詢得參考資料。本書最新版為第五版,以ANSI C99為標(biāo)準(zhǔn)詳細介紹了C語言。
2.《The C programming_Language》
推薦理由:C語言之父得作品權(quán)威性毋庸置疑。雖然書籍出版時間比較老,好像也沒更新,不過仍不失為經(jīng)典書籍,網(wǎng)上有這本書得英文電子版提供
下載
。
3.《C 專家編程》
推薦理由:本書可以幫助有一定經(jīng)驗的C程序員成為C編程方面的專家,最關(guān)鍵的是本書寓教于樂,讓你充分享受編程的樂趣。
4.《C缺陷與陷阱》
推薦理由:書中所揭示的知識能幫助您繞過C語言自身得陷阱和缺陷,減少代碼中許多常見的Bug。
5.《unix環(huán)境高級編程》
推薦理由:既然是UNIX環(huán)境下C編程,就不得不說說UNIX編程書籍。Stevens先生的《unix環(huán)境高級編程》是我竭力推薦的,也是我的案頭必備(如果對網(wǎng)絡(luò)編程有興趣的,可以學(xué)習(xí)一下Stevens先生的《UNIX網(wǎng)絡(luò)編程》兩卷,如果覺得還不過癮,可以再看看《TCP/IP詳解》三卷)。
6.《計算機編程藝術(shù)》
推薦理由:算法大師得嘔心瀝血之作。計劃出版五卷書,目前好像已出版3卷。對算法有興趣得可以研究一下。
過程篇
1. 學(xué)習(xí)C語法
語法的學(xué)習(xí)對于一個具有編程底子的來說,就很輕松了;即使你以前沒有學(xué)習(xí)過其他編程語言,我相信有2個星期,你也能輕松搞定。
需要注意的是,不要太糾纏于語言的細節(jié),比如:運算符優(yōu)先級與結(jié)合性的問題等。
2. 學(xué)習(xí)C標(biāo)準(zhǔn)庫
ANSI C庫把函數(shù)分為不同的組,每個組都具有與之相關(guān)的頭文件。C語言標(biāo)準(zhǔn)庫相對于其他語言,比如C++,
Java
來說是非常短小精悍的,但首先應(yīng)著重對以下庫進行學(xué)習(xí):
ctype.h:字符處理
math.h:數(shù)學(xué)庫
stdio.h:標(biāo)準(zhǔn)I/O庫
stdlib.h:通用工具庫
string.h:字符串處理
time.h:時間和日期
如果想了解完成的ANSI C庫,你可以購買相關(guān)的書籍,這些書籍一般會詳細介紹每個函數(shù)的用戶和一些注意點;當(dāng)然你也可以登陸
http://www.dinkumware.com/manual
…… amp;page=index.html獲取ANSI C庫詳細信息。
3.攻克C的難點
C語言聲明:
C語言的聲明確實讓我覺得恐怖,比較晦澀難懂,而且聲明的形式和使用的形式還類似。比如如下的聲明恐怕就連很多熟悉C多年的程序員也不是一眼就能看出來的:
char * const * (*next)();
那么有沒有一種好的記憶方法或規(guī)則來搞清楚呢,好像沒有,如果有的話也不是這樣折磨人了。不過可以看看《C專家編程》第三章的內(nèi)容,或許你會有所收獲。也只能多學(xué)多練了,所謂熟能生巧嘛,希望這個問題不要在你的心靈上留下陰影。
數(shù)組與指針:
數(shù)組與指針的關(guān)系,在標(biāo)準(zhǔn)中并沒有作很詳細的規(guī)定,而且好多C入門的書籍在這個問題上并沒有給出很詳細的說明,所以會給人造成很多誤解。
對于這個問題,你可以參考《C缺陷與陷阱》4.5節(jié)和《C專家編程》第4,9,10章,相信你這里面的內(nèi)容搞透徹,以后就不會再被這個問題搞迷惑。
指針與內(nèi)存:
如果你以后編寫規(guī)模較大的程序,你可能發(fā)現(xiàn)這個問題可能會是你最大的煩惱,而且可能會是你消耗最多調(diào)試時間的事項。
C版本的問題:
你得特別小心該問題,最好不要在你的程序中混合使用不同版本C的特性,否則會給你帶來很迷惑的問題。如果一定要用,你最好清楚自己在做什么。
還有一些其他C中的難點和容易錯誤的地方,可以學(xué)習(xí)前人的一些經(jīng)驗。以下是一個c FAQ的鏈接地址,相信在這篇文檔中有你需要的大部分問題的解決方法。
http://c-faq-chn.sourceforge.net/
4.UNIX環(huán)境編程
學(xué)習(xí)了以上內(nèi)容之后,我相信,你就可以進行unix環(huán)境編程了。不過你可能需要對操作系統(tǒng)理論有一點點的了解,這樣學(xué)起來會比較輕松一些。
Unix環(huán)境編程,你應(yīng)該著重IO和進程兩大塊內(nèi)容!禪nix環(huán)境高級編程》中對Unix環(huán)境編程有著非常詳細且深入的論述,而且書中有大量實用性例子程序,不過可能得花上幾個月得時間,好好啃一啃了。
在扎實掌握以上內(nèi)容,不代表你得C語言學(xué)習(xí)支路已經(jīng)完成,相反,才剛剛開始。以后你需要用學(xué)到得知識去解決大量不同實際問題,在不斷得實踐過程中,你會近一步加深對C的理解。有了以上基礎(chǔ)之后,你會發(fā)現(xiàn),在實踐過程中需要的其他知識,你會非?焖俚恼莆。
方法篇
編程是一個實踐性很強的工作,最好的學(xué)習(xí)方法就是邊看書邊調(diào)試代碼,把書上的例子程序反復(fù)的修改調(diào)試運行,從中得到自己的體會。 在自己的學(xué)習(xí)或工作中寫的一些測試的程序,要分門別類的保存下來,在以后的實際工作中不斷的整理,日積月累就是一個很好資源庫了。
有時候,可能會覺得書上的例子作為理解概念時比較通俗易懂,但實用價值不高。所以要提高自己的編程能力,你還需要學(xué)習(xí)別人的代碼,我認(rèn)為研究別人的代碼是提高自己實際編程能力最好且最快的途徑,現(xiàn)在網(wǎng)絡(luò)上有很多價值很高的開源代碼可供你選擇學(xué)習(xí)。
最后,不得不提到的一個問題就是,千萬不要讓自己淹沒在各種技術(shù)細節(jié)的海洋中,比如前綴++運算符問題,表達式計算優(yōu)先級問題等。
學(xué)習(xí)UNIX下C編程也好,還是其他編程語言,我們最后的目標(biāo)都是為了使用計算機解決現(xiàn)實中的問題,所以積累日常工作中常見問題的解決方法,并形成一定的范式,做一些提煉才是最重要的。說到底,設(shè)計和編程所做的事情,就是方法論,不管你是無意識還是有意識的,所以一定要注重積累。
補充說明
1. 對于有人問是否需要一份ANSI C99標(biāo)準(zhǔn),對于一般開發(fā)人員,并沒有必要,且不說其語言晦澀難懂,即使你能從頭到尾學(xué)習(xí)一遍,我想對你的編程也沒有什么提高。
2. 目前多數(shù)UNIX操作系統(tǒng)所帶的cc、gcc等編譯器好像并不支持 C99 的所有新特性,不過現(xiàn)在已經(jīng)有足夠多的新特性普遍可用,因此有理由開始認(rèn)真考慮在新的開發(fā)中采用 C99 特性,尤其是用在它們使得效率或清晰度本質(zhì)上發(fā)生變化的那些地方(比如以內(nèi)聯(lián)函數(shù)代替宏替換)。
3. 編程規(guī)范的問題:一般較為正規(guī)的軟件公司都會有自己的一套完成的編程規(guī)范,那么你遵守就好;如果你是自己學(xué)習(xí)的話,可以選擇一個較為通用的規(guī)范,最好的方法就是看別人是怎么寫代碼的。
本文來自ChinaUnix博客,如果查看原文請點:http://blog.chinaunix.net/u1/53296/showart_571365.html |
|