探究丨我們要掌握好多少C語言知識點才能做好C語言項目?
導言
很多初學C語言的小夥伴,在學習之初並沒有一個大概的概念,學習這門語言需要掌握多少知識點,怎麽才算學的差不多?
C語言的精髓點在哪? 學到多少東西才能夠達到做項目的標準?學習的時候需要註意哪些細節點?疑問太多以至於壓得自己喘不過氣來。筆者從項目的角度分析C語言到底需要掌握哪些知識,為什麽要去掌握這些點,怎麽去掌握,在此嘗試著總結以下幾點,未必都是對的,起碼可以做到親身經歷。
基本的數據操作,運算規則,常見程序結構設計
很多人覺得這麽幾點我都看了多少遍了,早就爛熟於心了。舉個簡單的例子,printf打印可能是最常使用的函數了,但是這個函數在真正大型工程中,很少直接去調用,為什麽?
主要項目中涉及到封裝的概念,什麽時機加入打印在調試大型系統的時候,更容易定位問題,這些編程思維對於初學者來說很難接觸到,也很難想到,任何復雜的事物都是由簡單的細節環繞而成,在學習之初不要覺得這些很簡單的數據操作很簡單,要真正納入自己的知識體系還是需要花點心思。可以在學習的時候,網上搜一些資料看這些數據操作以及運算規則是如何使用具體的場景中。
很多人初學者可能會有疑問覺得去哪裏找這些代碼去,世界軟件發展了這麽多年,最不缺的就是代碼,在github或者開源中國裏面代碼多如牛毛。學習的對象也是數不勝數。有點扯遠了,這觸及到另外一個學習編程的步驟,學會看懂別人的代碼,然後才能嘗試寫出優質的代碼,知己知彼百戰不殆。曾經聽一個編碼高手說過“技術這東西只要花的時間長,肯下功夫早晚都能搞定,只要進入狀態了,什麽方法都能想的出來”,看書學習也罷,看視頻學習也罷,需要讓自己插上聯想的翅膀,把自己的思維境界打開。
說到運算規則,涉及到代碼的格式的問題,說說身邊人的事情,去年招了一個剛畢業的學生,基本功不是很好,但是有一個特質專註力很高,能沈得住氣。當初見第一眼就覺得是個做軟件的苗子,有了第一印象後面的事情就順理成章了。很多經驗不是很足的同學,參加面試回答的問題也不是很理想,但還是被錄取了,其中一個因素就是你身上有公司需要的基因,這多少算來有點運氣的成分在裏面了。今年這哥們覺得很突然,說為啥當初剛開始寫代碼的時候為啥不要求那麽嚴格,說了幾句話,初學者特別是基礎很差的情況下,要求太多只會讓一個人慢慢失去對這個行業的信心,也許會錯失一個軟件天才。隨著時間推移能夠邁入軌道了,那麽就該要求一些基本的職業素養了,代碼的格式,就該要求了。很多初學者覺得寫的代碼越高深,越讓人看不懂才叫高手,有這種想法的趁早打住。大道至簡,這四個字在任何時候都不過時。做的復雜邏輯混亂只能說明當初在設計的時候,沒有徹底想明白,想明白了展示出來一般都比較舒坦平整。
指針,數組,結構體,枚舉靈活運用
不要只看這幾個字,幾乎是C語言裏面最精髓的代表。數組這個概念基本上還能理解透徹,說到指針這個應用場景太多,而且在什麽項目中幾乎都離不開指針的使用。變化無窮,會用的覺得其樂無窮,不懂的哭上天。記得在互聯網有個流傳很長時間的文章,林銳的我的大學十年(有興趣的同學可以去網上查閱,編程的人生也可以很彪悍,記得當初發燒期間還專門買了林銳的一本高質量編程)提到了做了一個C語言的項目,為了繞開指針最後全部用數組代替實現了,後來做的項目也黃了。不是說因為用數組使用就不行,項目的定位方向出問題了。用數組完全替代指針這條路也是可行的,但是會花費相當大的周折。
說到指針,不能不提到計算機專業開的另外一個課程,數據結構。數據結構就是原生數據或者組合數據的混合運用的一種規則集合。連接這些數據,將這些數據有機的串聯在一起,指針起到非常關鍵的作用。經常見到初學者說數據結構和天書差不多,幾乎看不懂,建議回爐好好學習指針,說到指針還是存在很多故事,在入門之初有幸遇到一位水平極高的老手帶著,基本功紮實的不得了,記得有一次使用指針忘記初始化,這老手嘆了口氣,當年我每次用指針錯一次,就被項目經理當眾批評一次,後來再也不敢不初始化使用了,所以印象才能這麽深刻,話說到這裏剛入門的小白挨多少批評或者鄙視,是最正常不過的事情了,這對於編程界來說稀松平常。
結構體在項目中用的特別多,很多初學者覺得結構體都在教材的最後章節,覺得不是那麽重要。其實結構體在一定層次上決定著軟件的脈絡框架。很多高手在設計模塊的時候,不是急急忙忙的寫代碼,而是先把頭文件裏面的結構體設計出來,簡單的來說就是把數據模型先搞起來。有個數據模型代碼實現起來就比較輕松了。面向對象裏面類的老祖宗就是結構體延伸來的。關於結構體如何賦值,包含著指針的情況下,如何賦值這些都是常見的初學者經常容易掉的坑。枚舉一般用在羅列不同類別,存在多個相同功能的實物,搭配switch使用的很多,在這就不一一列舉了。
函數的使用
函數是面向過程編程最基本的單位,任何C程序的運行都有函數的身影,因為程序的入口main就是一個函數,函數傳值方式,調用方式(遞歸,回調)都是函數內在的表現。函數的裏面又可以嵌套別的函數,使得程序慢慢變得復雜化。前幾天和一個非計算機專業的聊天,談到如何學習函數,說到了數學不好是不是編程不好學。函數的編程基本因子,和數學裏面的函數有一定的共性,但編程裏面的含義引申的層次更多,數學在一定層面就是提供一個工具或者方法而已,函數的設計裏面夾雜著諸多的編程思想。
檢驗一個程序員水平的高低可以簡單讓用函數實現一個相對復雜一些的功能,基本上就能看出編程思想掌握的深淺程度。不妨自己實現一個函數,檢驗下自己編程水準,函數的檢驗是面試裏面必不可少的題目。
一個函數基本上代表一個小的模塊,多個模塊有機的組合形成一個系統。建議初學者在學習函數的時候,不要滿足於會使用函數,還要讓自己站的層次更高一點。這能決定自己是一個純粹的執行者還是未來框架的設計者,不要覺得這些東西距離自己很遠,慢慢的積累時間長了,慢慢也就從量變變成質變了。
對於內存和性能有少許的理解
內存和性能對於初學者來說,可能覺得很遙遠,其實這兩樣東西貫穿整個編碼界,檢驗軟件功能最重要的兩項指標,軟件占用內存多少,運行時間長了會不會讓系統變緩慢。同時開啟在多個軟件的時候,你設計的軟件是不是變得很卡頓,這些都是大家平常在使用軟件時候經常遇見的現象。今天在車上閑聊,司機說當年的XP運行的多好,非要升級搞什麽windows7或者windows10之類的,把電腦搞的卡的要死。這其實是微軟操作系統設計理念的一個延伸,用空間換時間。說的通俗點,提前把一些常見的軟件加載到內存裏面,使用的時候流暢度會感覺好一些,理念這麽好,為啥還變得這麽卡慢,主要機器配置太低了。微軟這幫大佬認為你機器內存和CPU還是相當不錯的,因為現在硬件成本基本上接近白菜價了。在機器配置還不錯的情況下,windows7,10運行的速度還是很不錯的。透過這些生活常識,歸結對編程,對編碼的認知程度上,慢慢就會建立起自己的知識體系。
這點在嵌入式設備上表現的很明顯,一般嵌入式設備內存和cpu配置不是高,內存就要省著點用,占用CPU很高的一些函數盡量少去調用,避開雷區,這些經驗就要靠平時多去積累,多去思考,才會融入自己知識體系,才會慢慢認識到寫代碼其實在編程時候,只占很小的一部分,大部分的時間還是在思考如何讓代碼更加利索,內存更少的去使用,cpu占用率低一些。認識到這些時候,層次就不一樣了,就會越來越覺得設計思想的重要性了。
嘮嘮叨叨說了以上四點,可能和裏面具體的概念不是很搭邊,主要站在項目的角度上做了一些延伸,從項目的角度去認識一些基本的概念,讓初學者在學習的時候,有個大致的認識。在知識層次上面稍微做了一些拉伸。稍微上了一點高度,滲入了一些編程思想。希望初學者對此有一個更加深刻一點的認識,不要拘泥於語法的限制,編程語言服務於編程思想。學到了真正的編程思想,才叫貨真價實的懂編程。
筆者就大致講這麽多,希望對各位有所幫助!喜歡文章可以支持一下哦!
博主是一個有著7年工作經驗的架構師,對於c++,自己有做資料的整合,一個完整學習C語言c++的路線,學習資料和工具。可以進我的Q群7418,18652領取,免費送給大家。希望你也能憑自己的努力,成為下一個優秀的程序員!另外博主的微信公眾號是:C語言編程學習基地,歡迎關註!
探究丨我們要掌握好多少C語言知識點才能做好C語言項目?