學(xué)C語(yǔ)言到底學(xué)些什么— “語(yǔ)法”和“函數(shù)庫(kù)”
C語(yǔ)言學(xué)習(xí)的關(guān)鍵,是要先搞明白,學(xué)C語(yǔ)言到底是在學(xué)些什么?
我這么一問(wèn),有的同學(xué)就要翻開(kāi)課本,指著目錄說(shuō),我知道我知道,有變量,數(shù)據(jù)類型,循環(huán)語(yǔ)句,函數(shù),哦哦哦,還有指針等等!
很遺憾,如果你以為學(xué)習(xí)C語(yǔ)言就是學(xué)習(xí)這些東西,那你得趕緊糾正一下看法,否則接下來(lái)的學(xué)習(xí)會(huì)困難重重。因?yàn)槲以?jīng)就是這么掉到坑里的,這種狹隘的觀點(diǎn)讓我浪費(fèi)了大量的時(shí)間去學(xué)習(xí)瑣碎的細(xì)節(jié),又讓我遲遲不能接觸到更重要的知識(shí),結(jié)果是眼高手低——知道許多別人不知道的無(wú)用知識(shí),但是又寫(xiě)不出什么真正像樣的程序來(lái)。
所謂“語(yǔ)法”,就是入門教材里最著重講解的內(nèi)容。也就是那些所謂的變量、數(shù)據(jù)類型、分支判斷、循環(huán)、函數(shù)、指針等等。
這些內(nèi)容比較枯燥,但是好消息是這些內(nèi)容并不難,都是一些格式化的東西。只要你多練習(xí),就會(huì)自動(dòng)的刻在你的腦子里,成為一種下意識(shí)的習(xí)慣。
但是 “語(yǔ)法”本身其實(shí)沒(méi)什么用。因?yàn)樗皇且环N格式規(guī)范,你學(xué)得再好,也不能引導(dǎo)你寫(xiě)出厲害的程序。因?yàn)樵谲浖O(shè)計(jì)中,實(shí)際上最核心的部分還是在于其 “函數(shù)庫(kù)”部分。
什么是 “函數(shù)庫(kù)”?
簡(jiǎn)單來(lái)說(shuō),函數(shù)庫(kù)就是別人編寫(xiě)好的C函數(shù),直接提供給你用,你只要調(diào)用里面的函數(shù),就能實(shí)現(xiàn)一定的功能。例如 printf() 函數(shù),你肯定知道,只要調(diào)用這個(gè)函數(shù),你就能夠在那個(gè)黑糊糊的窗口里顯示一段文字。你并不明白 printf() 的內(nèi)部工作原理,但是你知道你只要按照說(shuō)明去調(diào)用,就能夠?qū)崿F(xiàn)對(duì)應(yīng)的功能。
這就是函數(shù)庫(kù)——?jiǎng)e人寫(xiě)好的,打包送到你面前,你可以自由調(diào)用來(lái)做各種各樣的事情的函數(shù)集合。
我來(lái)說(shuō)幾個(gè)來(lái)自函數(shù)庫(kù)的函數(shù),例如 CreateWindowEx() 函數(shù)可以用來(lái)創(chuàng)建一個(gè)窗體(這個(gè)函數(shù)由微軟提供),例如 GaussianBlur() 函數(shù)可以用來(lái)對(duì)一個(gè)圖像進(jìn)行高斯模糊處理(這個(gè)函數(shù)由 OpenCV 提供),再比如 evhttp_new() 函數(shù)可以創(chuàng)建一個(gè) HTTP 服務(wù)程序(這個(gè)函數(shù)由 libevent 提供)……
其他還有什么庫(kù)函數(shù)?太多了。從控制網(wǎng)絡(luò)通信,到截取視頻畫(huà)面并分析其中的人臉位置,到加解密本地文件,甚至包括微信收發(fā)消息,抓取淘寶商品信息……庫(kù)函數(shù)的數(shù)量和有用程度遠(yuǎn)遠(yuǎn)超乎大家的想象。
誒?你從來(lái)沒(méi)聽(tīng)說(shuō)過(guò)還有這些東西?課本里也沒(méi)提到?
那是因?yàn)槟憧吹氖侨腴T教材,著重講解語(yǔ)法,順帶提到了少量的 C 語(yǔ)言自帶的庫(kù)函數(shù)而已。事實(shí)上 C 語(yǔ)言包含的庫(kù)函數(shù)本身就有不少,但是更多更強(qiáng)大的還是許多第三方庫(kù)函數(shù),例如我上面提到的這些。
重點(diǎn)是在于,我想告訴你,庫(kù)函數(shù)才是你學(xué)習(xí)C語(yǔ)言并將其應(yīng)用于實(shí)際的關(guān)鍵!
學(xué)會(huì)調(diào)用別人的庫(kù)函數(shù),甚至寫(xiě)出自己的庫(kù)函數(shù),都是極其重要的。因?yàn)橐粋(gè)函數(shù),本質(zhì)上就是一個(gè)功能單位。你擁有的基礎(chǔ)設(shè)施越多,你的發(fā)揮空間越大。道理就是這么簡(jiǎn)單。這就是我需要向大家強(qiáng)調(diào)的第二個(gè)觀點(diǎn),要想寫(xiě)出實(shí)用的C程序,一大關(guān)鍵就是研究并學(xué)會(huì)使用各種庫(kù)函數(shù)。
你看見(jiàn)隔壁王二寫(xiě)了個(gè)三維程序能讓一個(gè)彩色的立方體在空中旋轉(zhuǎn)?快找 OpenGL 庫(kù)函數(shù)來(lái)用。什么?劉大寶寫(xiě)了個(gè)網(wǎng)絡(luò)軟件能在局域網(wǎng)里聊天?快找 Socket 庫(kù)來(lái)用。
看見(jiàn)了嗎?庫(kù)函數(shù)有多重要?
但是,函數(shù)庫(kù)的學(xué)習(xí)并不是孤立的。許多庫(kù)函數(shù)背后需要一定的領(lǐng)域知識(shí)支撐。同樣如我第一個(gè)觀點(diǎn)所述,需要預(yù)備知識(shí)。學(xué)懂一個(gè)函數(shù)庫(kù),代表的不僅僅是明白如何調(diào)用那么簡(jiǎn)單, 而更反映了我們對(duì)一個(gè)特定領(lǐng)域——網(wǎng)絡(luò)、數(shù)字圖像、密碼學(xué)、操作系統(tǒng)等的認(rèn)識(shí)。
編輯:admin 最后修改時(shí)間:2018-05-08