0
  • 聊天消息
  • 系統(tǒng)消息
  • 評(píng)論與回復(fù)
登錄后你可以
  • 下載海量資料
  • 學(xué)習(xí)在線課程
  • 觀看技術(shù)視頻
  • 寫(xiě)文章/發(fā)帖/加入社區(qū)
會(huì)員中心
創(chuàng)作中心

完善資料讓更多小伙伴認(rèn)識(shí)你,還能領(lǐng)取20積分哦,立即完善>

3天內(nèi)不再提示

如何學(xué)習(xí)C語(yǔ)言,C語(yǔ)言的知識(shí)框架

STM32嵌入式開(kāi)發(fā) ? 來(lái)源:STM32嵌入式開(kāi)發(fā) ? 2020-08-27 14:09 ? 次閱讀

如果你不知道如何學(xué)習(xí)C語(yǔ)言,那么先看一下C語(yǔ)言的知識(shí)框架。

C語(yǔ)言是世界上最值得學(xué)習(xí)的語(yǔ)言

學(xué)習(xí)C語(yǔ)言之前,首先要明確地告訴自己,C語(yǔ)言是世界上好的語(yǔ)言。

如今決定學(xué)習(xí)任何一門(mén)其他語(yǔ)言之前,都要先考察這個(gè)語(yǔ)言有什么成功項(xiàng)目嗎?唯獨(dú)C語(yǔ)言沒(méi)有必要問(wèn),因?yàn)槭澜缟纤凶钭钪匾牡南到y(tǒng)中,都必然有C語(yǔ)言的身影。比如操作系統(tǒng)內(nèi)核、高級(jí)語(yǔ)言底層等等。

為什么C最適合擔(dān)任系統(tǒng)核心?主要原因可能是C語(yǔ)言具有和匯編語(yǔ)言的對(duì)應(yīng)性,一條C語(yǔ)言代碼,對(duì)有經(jīng)驗(yàn)的人來(lái)說(shuō),可以轉(zhuǎn)換為一條或多條匯編代碼,也就是說(shuō)編譯結(jié)果具有可預(yù)測(cè)性。C代碼不會(huì)在被編譯時(shí)被加上奇奇怪怪的修飾,也不會(huì)在二進(jìn)制兼容性方面帶來(lái)大問(wèn)題。這種穩(wěn)穩(wěn)當(dāng)當(dāng)?shù)恼Z(yǔ)言,一切都在掌握之中,一切榮耀歸屬于coder,一切錯(cuò)誤也歸罪于coder。

學(xué)習(xí)C語(yǔ)言的同時(shí),就自然而然的理解了硬件與操作系統(tǒng)的淺表一層。比如int有幾個(gè)字節(jié)的問(wèn)題,已經(jīng)是QQ加群驗(yàn)證是否是程序員的一個(gè)標(biāo)準(zhǔn)了(笑),這從側(cè)面說(shuō)明了學(xué)習(xí)C語(yǔ)言時(shí)確實(shí)會(huì)關(guān)心底層軟硬件的實(shí)現(xiàn)。C語(yǔ)言簡(jiǎn)單的基于值類(lèi)型的數(shù)據(jù)類(lèi)型體系(引用靠指針,指針本身也是值類(lèi)型),保持了和硬件底層的一致性(即內(nèi)存、緩存、寄存器只能保存值),不會(huì)出現(xiàn)其他語(yǔ)言比如C#那樣既有值又有引用反而對(duì)理解底層實(shí)現(xiàn)制造了障礙。

從某些角度上講,C語(yǔ)言從設(shè)計(jì)上來(lái)說(shuō)并不是為了讓我們更好的寫(xiě)邏輯代碼而設(shè)計(jì)的,它真的是“只能是這樣”,沒(méi)有對(duì)錯(cuò)好壞之分。因?yàn)橛?jì)算機(jī)體系結(jié)構(gòu)就是這樣的、匯編就是這樣的,所以C語(yǔ)言大致也只能是這樣的,誰(shuí)也不能隨意捏造它。它足夠簡(jiǎn)單,評(píng)論它的設(shè)計(jì)優(yōu)劣意義不大。

廢了這么多口舌,是為了堅(jiān)定思想,端正態(tài)度,只有抱著“最好”的態(tài)度,才能排除雜念,勇往直前。時(shí)代在進(jìn)步,某些東西易逝,而另一些東西持久。很多編程大師都用親身經(jīng)歷告訴你,C語(yǔ)言永遠(yuǎn)值得用最純粹的態(tài)度去學(xué)習(xí)。

C語(yǔ)言的語(yǔ)言本身很容易“精通”,一旦你理解了指針、函數(shù)指針等問(wèn)題,基本知識(shí)方面就橫行無(wú)阻了,很少會(huì)遇到完全沒(méi)見(jiàn)過(guò)的語(yǔ)法。

C語(yǔ)言基本學(xué)習(xí)過(guò)程真的沒(méi)有太多好講的,假設(shè)每天學(xué)習(xí)兩小時(shí),每周學(xué)習(xí)5天,只要?jiǎng)邮侄鄬?xiě)例子,把例子保存好隨時(shí)翻看,那么C語(yǔ)言的語(yǔ)法基礎(chǔ)很快就能全部過(guò)完一遍,估計(jì)半個(gè)學(xué)期的時(shí)間就能看完。難點(diǎn)可能是在指針的使用,這需要多看資料、多畫(huà)圖、多寫(xiě)代碼嘗試,給自己點(diǎn)時(shí)間強(qiáng)行突破即可。

但是問(wèn)題也在這里,由于宏和指針的存在,萬(wàn)事皆有可能。很多經(jīng)典的C代碼,真的是沒(méi)見(jiàn)過(guò)之前根本不知道還能這么用,舉個(gè)入門(mén)級(jí)的例子,Linux內(nèi)核中的一個(gè)通用鏈表:

// 定義鏈表節(jié)點(diǎn)結(jié)構(gòu)struct list_head{struct list_head *next, *prev;};// 創(chuàng)建鏈表#define LIST_HEAD_INIT(name) { &(name), &(name) }#define LIST_HEAD(name) struct list_head name = LIST_HEAD_INIT(name)// 判斷鏈表是否為空static inline int list_empty(const struct list_head *head){return head->next == head;}// 運(yùn)行時(shí)初始化鏈表#define INIT_LIST_HEAD(ptr) do { (ptr)->next = (ptr); (ptr)->prev = (ptr); } while (0)// 我自己寫(xiě)的測(cè)試函數(shù),方便讀者閱讀:int main(){LIST_HEAD(my_list_head);printf("列表是否為空 %d ", list_empty(&my_list_head));return 0;}

C語(yǔ)言寫(xiě)的經(jīng)典代碼經(jīng)常會(huì)用這種“過(guò)度簡(jiǎn)潔”的語(yǔ)法,初學(xué)之后會(huì)看得云里霧里的。如果你能看懂,又會(huì)有一個(gè)更大的問(wèn)題——這個(gè)list_head結(jié)構(gòu)體里面,沒(méi)有數(shù)據(jù)。自定義數(shù)據(jù)應(yīng)該放在哪呢?這又需要深一步研究了。

稍微高深點(diǎn)的比如任意動(dòng)態(tài)語(yǔ)言的源碼,比如Lua的源碼,對(duì)于剛學(xué)懂了C語(yǔ)言的同學(xué)來(lái)說(shuō),真是每個(gè)字都懂,連在一起就不認(rèn)識(shí)的感覺(jué)。還有一些經(jīng)典算法,比如Subversion的源碼,都很值得深入分析,只要理解一個(gè)模塊,就會(huì)收獲巨大。具體的例子這本書(shū)里提到好幾個(gè):

賞析一下書(shū)中前幾個(gè)問(wèn)題:

第1章 正則表達(dá)式匹配器

第2章 Subversion中的增量編輯器:像本體一樣的接口

第3章 我編寫(xiě)過(guò)的最漂亮代碼

第4章 查找

可能是知識(shí)結(jié)構(gòu)不足,本書(shū)后面的例子我讀起來(lái)有點(diǎn)不清晰。對(duì)C語(yǔ)言學(xué)習(xí)者來(lái)說(shuō),前幾個(gè)例子非常值得一讀,可以迅速意識(shí)到自己的不足并迅速成長(zhǎng)。本書(shū)建議先找電子版試讀。

關(guān)于C語(yǔ)言開(kāi)發(fā)環(huán)境:

1、Windows平臺(tái),請(qǐng)使用Dev-C++。不要用Visual Studio,對(duì)C語(yǔ)言支持不完整。

2、安裝Linux虛擬機(jī),桌面版本的,比如Ubuntu,現(xiàn)在貌似“深度Linux”挺火,沒(méi)試過(guò)。

關(guān)于進(jìn)階

C語(yǔ)言的進(jìn)階會(huì)遇到兩個(gè)主要問(wèn)題:

1、明白基礎(chǔ)以后,缺少大量練習(xí)。而大量練習(xí)本身會(huì)非常費(fèi)時(shí)間,因?yàn)樵陬櫦罢Z(yǔ)法的同時(shí)要顧及邏輯問(wèn)題,捉襟見(jiàn)肘。這時(shí)候的初學(xué)者,邏輯抽象能力和語(yǔ)法使用都是半吊子,非常難受。

2、閱讀代碼方面,C語(yǔ)言的成熟工程代碼一般會(huì)比較冗長(zhǎng),函數(shù)中間夾雜著很多宏和指針操作,我閱讀的感覺(jué)是讀后面忘前面,非常難入手。如果不明白某個(gè)函數(shù)的功能,強(qiáng)行將其讀懂非常費(fèi)時(shí)費(fèi)力,容易放棄。

這樣一來(lái),學(xué)完基本知識(shí)之后的進(jìn)階之路真的非常陡峭。

我個(gè)人大膽給出C語(yǔ)言進(jìn)階的一個(gè)相對(duì)緩和的路線:

1、實(shí)現(xiàn)鏈表、可變長(zhǎng)數(shù)組、哈希表等基本數(shù)據(jù)結(jié)構(gòu),實(shí)現(xiàn)方便的string結(jié)構(gòu)體。然后大膽的用在自己寫(xiě)的程序中。不要怕寫(xiě)的有BUG,也不要怕效率不高?,F(xiàn)代編程中容器是非常關(guān)鍵的武器,沒(méi)有容器寸步難行。而編寫(xiě)容器時(shí)會(huì)練到封裝、指針、內(nèi)存分配,都是C語(yǔ)言進(jìn)階時(shí)極其重要的方面。

2、如果工作學(xué)習(xí)中用到C語(yǔ)言就再好不過(guò),比如現(xiàn)在很多本科、碩士畢業(yè)論文都要用C語(yǔ)言實(shí)現(xiàn),那么這時(shí)候抓住機(jī)會(huì)多練練,是最好的。

3、嘗試ACM競(jìng)賽題,ACM競(jìng)賽和OnLineJudge平臺(tái)。類(lèi)似有很多,北大、北郵這種大學(xué)都有類(lèi)似的網(wǎng)站,上面不僅有題目,還有算法、有答案、有提示,還能直接在網(wǎng)頁(yè)上做題。刷題可以獲得及時(shí)反饋,一旦你AC了3道題,那種成就感可以讓你繼續(xù)下去,哈哈。不過(guò)除非你興趣就是算法本身,那么刷30道題基本就可以了,畢竟這種刷題會(huì)猛烈地提高算法能力,但是對(duì)架構(gòu)能力的提升幾乎沒(méi)有任何作用,對(duì)大多數(shù)人來(lái)說(shuō)不建議刷太多。

4、非常重要的私貨:如果除了做練習(xí)題以外沒(méi)有練習(xí)機(jī)會(huì),那么請(qǐng)把C語(yǔ)言放一下,快速學(xué)習(xí)Python(首選)、Lua(次選)、JavaScript(或TypeScript更好)等能夠立即實(shí)現(xiàn)功能效果的語(yǔ)言。學(xué)習(xí)好的動(dòng)態(tài)語(yǔ)言有兩方面好處:

第一:表層來(lái)說(shuō),能迅速提高邏輯代碼的編寫(xiě)能力。用C語(yǔ)言構(gòu)思半天才能寫(xiě)一點(diǎn)的功能,用動(dòng)態(tài)語(yǔ)言會(huì)快速的多,動(dòng)態(tài)語(yǔ)言將我們從內(nèi)存分配、容器等基本問(wèn)題中解脫出來(lái),直接實(shí)現(xiàn)我們想要的效果。用動(dòng)態(tài)語(yǔ)言實(shí)現(xiàn)之后,可以用C語(yǔ)言仿寫(xiě)這些邏輯代碼,相當(dāng)于按圖索驥,直達(dá)目的。

第二:深層來(lái)說(shuō),較高級(jí)的語(yǔ)言對(duì)底層的語(yǔ)言編寫(xiě)有強(qiáng)烈的指導(dǎo)意義。我個(gè)人在工作中使用C++用了很長(zhǎng)時(shí)間,但是總感覺(jué)遇到瓶頸無(wú)法突破。直到我學(xué)習(xí)了Python,寫(xiě)了一兩個(gè)比較復(fù)雜的工具,從另一個(gè)角度突破了邏輯設(shè)計(jì)的屏障,才感覺(jué)到編程水平有了明顯提高。

第三:在掌握了Lua或Python后,再找資料一邊學(xué)習(xí)一邊看Lua和Python的C源碼,對(duì)提高C語(yǔ)言水平有實(shí)質(zhì)性的幫助。

這里舉一個(gè)簡(jiǎn)單的例題:一個(gè)文件中有很多對(duì)ID和字段,這些ID和字段對(duì)分別代表另一個(gè)文件。而另一個(gè)文件內(nèi)容可能會(huì)鏈接到更深一級(jí)的文件。怎樣讀取這些文件組成一棵樹(shù)呢?

這個(gè)問(wèn)題對(duì)能力達(dá)到一定水平的人是基礎(chǔ)問(wèn)題,而對(duì)于初學(xué)者來(lái)說(shuō)可能是一個(gè)門(mén)檻。這種問(wèn)題我的建議是用Python或Lua的表、字典來(lái)解決,然后理清思路之后,改寫(xiě)為C代碼。

總結(jié)

寫(xiě)了很多,感覺(jué)再寫(xiě)下去個(gè)人私貨就太多了,并不客觀??傊瓹語(yǔ)言的學(xué)習(xí)是知識(shí)點(diǎn)少、難點(diǎn)多。上面針對(duì)初學(xué)提供了一些建議,進(jìn)階方面寫(xiě)了很多個(gè)人的心得體會(huì),希望能給學(xué)習(xí)C語(yǔ)言的初學(xué)者和進(jìn)階者提供一些幫助。如何學(xué)習(xí)C語(yǔ)言這是個(gè)挺重要的大問(wèn)題,讀者若有意見(jiàn)和建議,可以討論交流,有問(wèn)題我可以修正。

聲明:本文內(nèi)容及配圖由入駐作者撰寫(xiě)或者入駐合作網(wǎng)站授權(quán)轉(zhuǎn)載。文章觀點(diǎn)僅代表作者本人,不代表電子發(fā)燒友網(wǎng)立場(chǎng)。文章及其配圖僅供工程師學(xué)習(xí)之用,如有內(nèi)容侵權(quán)或者其他違規(guī)問(wèn)題,請(qǐng)聯(lián)系本站處理。 舉報(bào)投訴
  • 模塊
    +關(guān)注

    關(guān)注

    7

    文章

    2725

    瀏覽量

    47611
  • C語(yǔ)言
    +關(guān)注

    關(guān)注

    180

    文章

    7613

    瀏覽量

    137247
  • 代碼
    +關(guān)注

    關(guān)注

    30

    文章

    4808

    瀏覽量

    68814

原文標(biāo)題:如何學(xué)習(xí) C 語(yǔ)言?

文章出處:【微信號(hào):c-stm32,微信公眾號(hào):STM32嵌入式開(kāi)發(fā)】歡迎添加關(guān)注!文章轉(zhuǎn)載請(qǐng)注明出處。

收藏 人收藏

    評(píng)論

    相關(guān)推薦

    語(yǔ)言模型開(kāi)發(fā)框架是什么

    語(yǔ)言模型開(kāi)發(fā)框架是指用于訓(xùn)練、推理和部署大型語(yǔ)言模型的軟件工具和庫(kù)。下面,AI部落小編為您介紹大語(yǔ)言模型開(kāi)發(fā)框架。
    的頭像 發(fā)表于 12-06 10:28 ?158次閱讀

    NPU支持的編程語(yǔ)言有哪些

    NPU(Neural Processing Unit)是一種專(zhuān)門(mén)為深度學(xué)習(xí)和人工智能應(yīng)用設(shè)計(jì)的處理器。NPU支持的編程語(yǔ)言通常與它所集成的平臺(tái)或框架緊密相關(guān)。以下是一些常見(jiàn)的編程語(yǔ)言
    的頭像 發(fā)表于 11-15 09:21 ?802次閱讀

    C語(yǔ)言指針學(xué)習(xí)筆記

    本文從底層內(nèi)存分析,徹底讓讀者明白C語(yǔ)言指針的本質(zhì)。
    的頭像 發(fā)表于 11-05 17:40 ?270次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>指針<b class='flag-5'>學(xué)習(xí)</b>筆記

    C語(yǔ)言與Java語(yǔ)言的對(duì)比

    C語(yǔ)言和Java語(yǔ)言都是當(dāng)前編程領(lǐng)域中的重要成員,它們各自具有獨(dú)特的優(yōu)勢(shì)和特點(diǎn),適用于不同的應(yīng)用場(chǎng)景。以下將從語(yǔ)法特性、內(nèi)存管理、跨平臺(tái)性、性能、應(yīng)用領(lǐng)域等多個(gè)方面對(duì)C
    的頭像 發(fā)表于 10-29 17:31 ?386次閱讀

    C語(yǔ)言關(guān)鍵字--typedef

    C語(yǔ)言關(guān)鍵字使用方法學(xué)習(xí)指南!
    的頭像 發(fā)表于 10-07 12:44 ?310次閱讀

    C++語(yǔ)言基礎(chǔ)知識(shí)

    電子發(fā)燒友網(wǎng)站提供《C++語(yǔ)言基礎(chǔ)知識(shí).pdf》資料免費(fèi)下載
    發(fā)表于 07-19 10:58 ?7次下載

    按照這樣學(xué)習(xí)C語(yǔ)言,成為卷王不是夢(mèng)!

    在計(jì)算機(jī)編程領(lǐng)域,C語(yǔ)言被譽(yù)為一種強(qiáng)大而靈活的編程語(yǔ)言,掌握好C語(yǔ)言不僅可以讓你輕松駕馭各種編程任務(wù),還能夠?yàn)槟愕穆殬I(yè)生涯打下堅(jiān)實(shí)的基礎(chǔ)。但
    的頭像 發(fā)表于 07-06 08:04 ?335次閱讀
    按照這樣<b class='flag-5'>學(xué)習(xí)</b><b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>,成為卷王不是夢(mèng)!

    PLC編程語(yǔ)言C語(yǔ)言的區(qū)別

    在工業(yè)自動(dòng)化和計(jì)算機(jī)編程領(lǐng)域中,PLC(可編程邏輯控制器)編程語(yǔ)言C語(yǔ)言各自扮演著重要的角色。盡管兩者都是編程語(yǔ)言,但它們?cè)诙鄠€(gè)方面存在顯著的區(qū)別。本文將從多個(gè)維度深入探討PLC編程
    的頭像 發(fā)表于 06-14 17:11 ?3053次閱讀

    如何成為一名嵌入式C語(yǔ)言高手?

    相關(guān)教材、參加在線課程或者參考編程書(shū)籍來(lái)系統(tǒng)地學(xué)習(xí)C語(yǔ)言的基礎(chǔ)知識(shí),并通過(guò)編寫(xiě)簡(jiǎn)單的程序進(jìn)行實(shí)踐。 二、深入了解嵌入式系統(tǒng)的硬件架構(gòu)和工作原理嵌入式系統(tǒng)通常包含微控制器或微處理器等硬件
    發(fā)表于 04-07 16:03

    如何成為一名嵌入式C語(yǔ)言高手?

    相關(guān)教材、參加在線課程或者參考編程書(shū)籍來(lái)系統(tǒng)地學(xué)習(xí)C語(yǔ)言的基礎(chǔ)知識(shí),并通過(guò)編寫(xiě)簡(jiǎn)單的程序進(jìn)行實(shí)踐。 二、深入了解嵌入式系統(tǒng)的硬件架構(gòu)和工作原理嵌入式系統(tǒng)通常包含微控制器或微處理器等硬件
    發(fā)表于 03-25 14:12

    C語(yǔ)言基礎(chǔ)-為什么要使用C?

    當(dāng)今最流行的 Linux 操作系統(tǒng)和 RDBMS(Relational Database Management System:關(guān)系數(shù)據(jù)庫(kù)管理系統(tǒng)) MySQL 都是使用 C 語(yǔ)言編寫(xiě)的。
    發(fā)表于 03-25 11:20 ?472次閱讀

    C語(yǔ)言#define的應(yīng)用

    C/C++ 編程語(yǔ)言中,當(dāng)程序被編譯時(shí),被發(fā)送到編譯器,編譯器將程序轉(zhuǎn)換為機(jī)器語(yǔ)言,然后完成編譯并執(zhí)行該程序。預(yù)處理器也稱(chēng)為宏預(yù)處理器。
    發(fā)表于 03-06 11:29 ?393次閱讀
    <b class='flag-5'>C</b><b class='flag-5'>語(yǔ)言</b>#define的應(yīng)用

    plc編程語(yǔ)言c語(yǔ)言的聯(lián)系 c語(yǔ)言和PLC有什么區(qū)別

    PLC編程語(yǔ)言C語(yǔ)言的聯(lián)系 PLC(可編程邏輯控制器)是一種針對(duì)自動(dòng)化控制系統(tǒng)的特殊計(jì)算機(jī)。PLC編程語(yǔ)言是為了控制和管理自動(dòng)化生產(chǎn)過(guò)程中的各種設(shè)備而設(shè)計(jì)的。與之相比,
    的頭像 發(fā)表于 02-05 14:21 ?4280次閱讀

    c語(yǔ)言,c++,java,python區(qū)別

    操作系統(tǒng)、嵌入式系統(tǒng)等對(duì)性能要求較高的場(chǎng)景。C語(yǔ)言的語(yǔ)法相對(duì)簡(jiǎn)單,學(xué)習(xí)曲線較平緩,也是學(xué)習(xí)其他高級(jí)語(yǔ)言的入門(mén)
    的頭像 發(fā)表于 02-05 14:11 ?2506次閱讀

    vb語(yǔ)言c++語(yǔ)言的區(qū)別

    VB語(yǔ)言C++語(yǔ)言是兩種不同的編程語(yǔ)言,雖然它們都屬于高級(jí)編程語(yǔ)言,但在設(shè)計(jì)和用途上有很多區(qū)別。下面將詳細(xì)比較VB
    的頭像 發(fā)表于 02-01 10:20 ?2414次閱讀