C語言簡介&FAQ
C語言是什麼
C語言是一種計算機程式語言。
1970年前後,AT&T 貝爾實驗室的
Ken Thompson
根據BCPL語言設計出較先進的並取名為B
的語言,之後Dennis Ritchie
在此基礎上設計發明了C語言, 並首次在UNIX作業系統的 DEC PDP-11 計算機上使用。隨後,C語言和UNIX作業系統一起,攻佔了計算機世界的大片領地。在發展的過程中,出現了許多略有差別的C語言版本。1989年,美國國家標準研究所(ANSI)為C語言制定了一套ANSI標準,成為現行的C語言標準,就是所謂的
C89
。當然經過10年的發展,在C89
的基礎上又頒佈了C99
標準。現在流行的大部分編譯器完全支援C89
C99
。對於初學者來說,掌握經典的C89
即可。
為何要選擇純C
在某些時候,我們不得不只使用C語言而不是C++,這種情況稱為純C程式設計。最常見是因為以下兩個原因:
1、C++的語法很複雜,所以C++的編譯器很難製作。因此在很多平臺上沒有現成的C++編譯器,而C編譯器因為足夠簡單,幾乎到處都有,這時就只能用純C。實際上最初的C++編譯器也是用C語言來實現的。
2、仍然是因為C++很複雜,為了實現很多特性,做出的程式往往比用C做的類似功能程式體積要大很多,在程式的空間和時間要求比較高的時候,也只好選擇純C。
上面兩種情況經常共同出現,例項之一就是嵌入式裝置。各種微控制器往往沒有足夠的記憶體和處理器能力,在上面實現C++編譯器也比較困難,因此往往是純C開發,而非C++。
C++語言是什麼
C++和C的關係非比尋常。
1979年,當Bjarne Stroustrup在新澤西州的
Murray Hill
實驗室工作時,發明了C++。Stroustrup最初把這種新語言稱為“帶類的C”
,1983年,改名為C++。C++通過增加面向物件的特性擴充了C。因為C++產生在C的基礎之上,因此它包括了C所有的特徵、屬性和優點。在這個意義上,你可以認為C++是C語言的進化,這個進化的原因是複雜性(complexity)。一旦一個程式的程式碼超過25000~100000行,就很難從總體上把握它的複雜性了。C++突破了這個限制,幫助程式設計師理解並且管理更大的程式。當然今天的C++已經不只是C的進化那麼簡單,他還包含了其它很多很多的新內容,它是如此的複雜以至於你要花上幾倍於學習C的時間來學習他。但由於他和C的歷史淵源,所有支援C++的編譯器都能支援C。因此他倆也就被合稱為C/C++語言。
C++對於C的進化著重體現在規模上,幾乎C++的所有新特性,都是為大規模程式設計服務的。如果說C語言程式設計是單兵小組作戰的話,C++程式設計就是集團軍運動。
C/C++語言和其他語言有什麼關係
java
只要用一句話就可以概括,它是一種簡化了的跨平臺的C++
語言。掌握了C++
的人,學習java
幾乎是輕而易舉。-
basic pascal delphi
(其實是objectPascal
)perl
python
還有其他諸如此類的語言,或者與c
處於同一檔次,或者與C++
處於一個水平,學過C/C++
之後,再去學習他們是很容易的事。有人比較偏愛和看好python
,它的很多特性使他極有前途。lisp Scheme
是和C
的思維方式完全不同的一類,被稱為函數語言程式設計語言,在人工智慧等領域有奇妙的應用。有興趣的朋友可以去領略,如果你要成為一個大師,至少要學習其中的一種。
為什麼要學C/C++語言
考試的人不用討論這個問題,他們沒有選擇。如果我們有選擇,為什麼我們學習C語言而不是別的。
首先因為C本身是非常優秀的,他是世界上最偉大的程式語言之一。許多人認為C語言的產生標誌著現代計算機語言時代的開始。它成功地綜合處理了長期困擾早期語言的矛盾屬性。C語言是功能強大、高效的結構化語言,簡單易學,而且它還包括一個無形的方面:它是程式設計師自己的語言。它的設計、實現、開發由真正的從事程式設計工作的程式設計師來完成,反映了現實程式設計工作的方法。它的特性經由實際運用該語言的人們不斷去提煉、測試、思考、再思考,使得C語言成為程式設計師們喜歡使用的語言。
在程式設計規模越來越大的今天,用C往往會遭遇協作型的問題,而C++在保持了C的高效的同時,實現了大規模協作的可能,因而成為了真正工業化的語言。
C/C++的優秀,使得他是主流的,在20世紀70年代末和80年代初,C成為了主流的計算機程式語言,至今仍被廣泛使用。今天幾乎所有的作業系統、大部分的(大於70%)的應用軟體,90%以上的大型遊戲都是用C/C++編寫的。
在對執行速度和資源佔用有嚴格要求的領域,比如遊戲、即時控制、嵌入系統,基本都是C語言內嵌組合語言的天下。今天只有一種語言的效能比C強,那就是彙編,優化過的C程式的速度大約是彙編的95%-98%。但彙編基本不是常人用的。所以實際上C就是最快的語言。
主流的就意味著資料豐富。不論是程式設計時所需要的文件,還是學習的示例程式碼,甚至是平臺提供的介面和庫,C/C++語言版本都是最豐富的。業界的演算法研究理論研討,大部分都是C/C++語言,開原始碼的78%以上是C/C++.任何一家硬體軟體公司,當他開發一款能夠程式設計的裝置或是軟體,必然會提供C語言的介面函式。其他的語言,就不一定有這樣的好處了。不論是計算機圖形學、加密解密還是計算機程式設計的其他領域,C/C++簡直就是程式設計界的普通話。
根據
International Data Corporation
的統計,C/C++是全球開發者使用最多的程式語言。如果確實要投身程式設計界,不懂C/C++的話,根本就是Mission Impossible
。
如果你還不明白,我只需舉一個小例子。假設你現在有機會去學習一門外語,投入時間差不多,你會選擇學習英語呢,還是斯瓦希里語呢。(斯瓦希里語流行於非洲東部,為肯亞坦尚尼亞等國的官方語種)
- 當然,並不是說其他語言不值得學習,存在即是合理,今天存在的各種語言,當然都有它存在的價值,多學一點沒有壞處。沒有人禁止你在學會英語的基礎上再學習法語日語等等。況且為了找工作等現實原因,學習其他語言也是非常正常和必要的。
- 無論過去、現在還是將來,天底下不存在哪一門語言非學不可才能成為高手,思想最重要,“
不會XXX語言不算真正的高手
”之類的言論實在無聊之至。學C/C++,主要還是通過他學習程式設計思想。真正的武林高手,難道會侷限於手裡的那把大劍嗎。
但我們還是強烈建議初學者從C語言開始,因為除了上面所提的好處,C語言還足夠的簡單。初學者或許會覺得C很難,但請記住,那些是程式設計之難,不是C之難。當你學過三種以上語言的時候,就會越發體會到C的簡單。
程式設計時什麼東西最重要—-原始碼
按照一般程式語言的規則編寫的程式通常都是文字形式的,雖然還不能直接執行,但可以轉換成可執行的程式,它是真正程式的源頭,於是被稱為原始碼。
程式設計的主要工作就是在製造原始碼。由於原始碼幾乎人人都能看懂,而原始碼又可以生成真正的程式,所以取得了原始碼,就相當於取得了程式的一切,包括程式本身和程式背後的思想。基於此,大型軟體公司要把他們的原始碼嚴密的保護起來,而開源組織的第一條規則就是開放原始碼。而作為初學者的你,請妥善保管你所寫下的每一段原始碼,這都是你積累的財富。
能推薦幾本好書麼
當然,FAQ的目的之一就是這個。我將分別介紹純C、C++以及widows程式設計、資料結構演算法以及圖形庫等等的教材。市場上這些主題中任意一個的教材都是汗牛充棟,讀都讀不完。不過很顯然,大家都公認的經典,也只是那麼寥寥數本而已。下面推薦的都是這樣的著作,當然總是有好作品在不斷推出,我這裡不可能把他們都列舉出來,你可以用自己的犀利的目光把他們挑出來。
首先是純C的教材
第一本:
H.M.Deitel
和P.J.Deitel的
《C HOW TO PROGRAM》(C程式設計教程)。作者是父子,從事語言教材的編寫合計超過40年,本書被美國眾多高校選用為教材,既可入門也可翻閱,甚好。本FAQ作者認為如果你只打算看一本的話,那就選他好了。第二本:
Brian W.Kernighan
和Dennis M.Ritchie
的《The C Programming Language 》(C程式設計語言)。此書簡稱K&R,由C語言的建立者撰寫,是全球銷售最多的C語言教材,其品質不容置疑。不過不適合入門,適於在入門之後鞏固提高。實體書有原版和譯本購買,電子版英文較多。第三本:
譚浩強
的《C程式設計》。
優點在於,面向中國學生,語言易於理解,而且全書篇幅小,看過的人多,容易找到人請教。但是各方面的概念不深入,淺嘗輒止,實際上還有些小錯誤,不是很嚴謹。因此適合第一次入門學習,例題做完基本就可以拋棄了。有實體書和電子版下載。同時配套有習題集和習題解答,適合自學。第六本:
Kenneth A.Reek
的《C和指標》。
進階讀物,把指標一章演繹為一本書可見其技術精度。指標是C的靈魂,能領會本書中的理念,才能算是真正明白了C指標的奧妙,才算懂得了C。第七本:
Andrew Koenig
的 《C陷阱與缺陷》。
進階讀物,在認真讀完上面的入門書之前,暫勿閱讀。本書暢銷14年曆久不衰,足證品質。最後一本:ISO C89規範/C99規範。
一切關於C語言的疑問,只有一件東西最權威,那就是ISO的規範。但這不是正式出版物,是類似法律文字的技術說明,而且只有英文版。新手閱讀,提防吐血而亡。
END