03.04 為什麼這麼多人學不會C語言?

小松語錄


對初學者來說,C語言確實有一定的難點,但是C語言是基礎的語言,並不是最難的所以學不好的主要還是自身的問題。依據本人這麼多年的經驗,這嘗試分析下為何這麼多人學不好C語言?

C語言本身存在一定難度

C語言主要應用於操作系統、嵌入式底層開發等,在這些領域C語言一直都咱局主導位置,但是在入門上現在比較熱門的php、python、java等語言比C語言稍微容易一些。所以很多人學習到C語言的時候,理解起來很抽象,使用時變化莫測,覺得很難,自己就失去了興趣,慢慢地放棄了。特別是在指針的學習上,是一個檻,很多人就是倒在指針上的。

當然除了指針,C語言裡面還有一些回調、遞歸、函數指針、指針函數也有一定的難點,所以總的來講C語言還是有一定的難度 的,學習C語言一定要多練,不能光看書,多做一些項目慢慢地就好了。

意志力不夠沒有耐心,倒在黎明前夕

學習編程主要挺過去前兩年的積累經驗階段,後面就好多了,有些人就是迷迷糊糊的進入技術崗位了不知道到底做的是什麼,會有一天發現自己突然明白過來很多的事情,以前有些不明白的事情,突然覺得啥都明白了,看似是一件很神奇的事情,本質上來講都是日積月累構造成的。

很多人覺得自己學了這麼長時間還是很多不明白,就會產生厭倦心裡,自己都想要放棄,沒有了激情,慢慢地自己就放棄了,其實有時候默默地再堅持一會自己就會慢慢地掌握C語言的精髓,對C語言產生興趣。

C語言沒有別的語言好就業

這涉及一個很現實的問題,學習了編程語言就得找工作,如果學了不好找工作,肯定學習起來的動力就不足,畢竟C語言的工作崗位絕對數量並不少,但是相比java,php,python等語言還是沒法比,而且對入門者的要求相對更高點,薪資上也不一定有多大的優勢,所以對於初學者沒有多大的吸引力。目前這也是當前的市場實際情況。

C語言是不是就不值得學習了?其實這種說法是不對的,其實php,python等底層語言還不是一樣用C語言來實現,所以C語言的重要性不言而喻。不要聽信C語言已經過時之類的謠言,C語言一直都在默默無聞、踏踏實實地做著底層很重要的事情,經久不衰。想要在軟件行業立足發展,C語言還是很值得學習的。


擼車匯


我本人接觸C語言也將近10來年了,一直從事Linux C方面的工作,曾經作為培訓機構的Linux C語言講師,也教過數百嵌入式Linux方向的學員,下面我就來談談題主提問的問題。

C語言作為一門入門級語言,是大多數編程者的學習首選

據我瞭解,C語言作為一門入門級語言,大多數人在進入IT行業都要先學習C語言的。比如在大學期間,信息工程系、計算機系、通信工程系甚至機械設計與自動化系都要學習C語言基礎這門課。對於第一次接觸這門機器語言的大學生們,這無疑像是一本天書!所以很多人說學不會C語言,或者中途放棄,再或者轉學其他的。

依稀記得我上大學的時候,每天早上小湖邊的那位讀著“銀它,銀它(諧音) i n t”的校友,也許這就是一個剛剛接觸C語言的人的真實寫照吧。但是如果在學習了C語言的基礎上再去學習其他語言比如java語言,那麼就會變得相對輕鬆了。大多數Python、java等語言的學習者也都是從c語言的路上過來的。我相信,如果先學習java,然後再回過頭來學習C語言也不會感覺太難吧。

C語言學習過程之枯燥

C語言的學習枯燥主要表現在兩個方面,第一個因為它是一門編程語言,跟計算機打交道,

你對它熱情以待,它卻回報你各種err,無疑是給初學者最大的打擊;另外一個方面就是C語言學習並不像學習其他語言那麼有樂趣。我的一個學弟,剛開始跟我說以後也想走嵌入式Linux的道路,就在我的指導下學習,天天對著一個Ubuntu的黑框終端敲代碼,後來他發現同宿舍有個學習Android的,時不時的搞出來個APP,什麼音樂播放器,什麼登錄系統的,他感覺很有意思,慢慢的他就轉行了,受不了Linux c的枯燥。

沒有一顆持之以恆的心

剛開始學習編程的那個階段是最難熬的,一旦等學會了之後,說不定一下子就愛上了它,這是我對學編程的總結。很多人在學編程的路上堅持不下去,就慢慢的放棄了,很多計算機相關專業的畢業生,認為編程是無聊的、枯燥的、學不會的然後就拋棄了走編程的這條路。我身邊有不少C語言的大神,他們都是持之以恆坐上現在的這個位置的,什麼Linux驅動開發、嵌入式軟件開發、c語言開發等等都是C語言學習後的工作方向。

總結

有志者事竟成,只要你有一顆堅定的心,在配上那麼一點熱情,我相信每個人都會學會C語言的。

以上是我關於C語言學習的觀點,謝謝閱讀,覺得有道理就給個贊!


嵌入式Linux技術分享


筆者雖然現在很少寫C了,但在工作初期有多年C語言工作經驗,後續接觸過的高級語言就太多了,PHP,JAVA,GO,Python等都有一定深入研究,可以簡單說一下我的看法,當然,歡迎關注。


先簡單總結一下:

很多C語言的問題要對計算機系統有一定理解之後才能解決,就算有好的教材也不能簡單寫出bug free的代碼。

即使通過看書把C語言入了門,但是坑還是要親身去踩才能學到東西。

  1. 比如C語言不像Java一樣給你很多內置的類,類的方法都定義好了直接用就行了。在C語言裡這些都得自己寫。。。

  2. C語言也沒有Java的垃圾回收機制,還得學著自己管理內存,知道存在棧上的局部變量和分配了內存的變量在存儲上的區別。

  3. 還有malloc的坑,分少了會buffer overflow,忘記free了又會造成memory leak。

  4. unsigned int的坑。

不懂對應的系統知識,只能看著非常confusing的bug找不出原因。


然後我們具體看下C語言難在哪些點:


第一 C語言直接操作內存


特別是和內存關聯很近主要還是指針的存在,很多人說到指針就頭大,指針就是一把雙刃劍,能夠很好的解決邏輯問題,但指針一旦出現問題,找個問題特別費勁,底層語言直接崩潰對應的查找工具還不多,很多還得靠代碼解決,不像高級語言有內存回收,垃圾回收機制。


這就是高級語言比較有優勢的地方,並且高級語言參與的人多遇到問題,去解決的人也多,對應的工具也多。解決內存和性能的問題,就難倒了很多意志不是堅定的人。


而且與指針相關聯的很多東西,在開始學的時候都不是很好理解,回調函數,指針數組,這也是考驗耐性的時候,堅持去理解去學習,也就慢慢挺過去了,其實這些都是基本功能的組合,比如回調函數應用的場景,函數的執行時機已經確定,函數內容實現要根據具體的場景來定,這種在windows編程時候在傳遞句柄的時候用的多。


要理解回調還得知道函數指針是個啥概念,這種對初學者來說簡直就是天書。在學習的時候記住一點先去理解了再去考慮怎麼練習,實踐。不要上來逮著書本上的練習題目呼呼的去敲代碼,要理解個差不多再去動手也不遲。


指針直接的導向就是容易導致內存洩漏,而且如果不是大塊的洩漏解決起來都特別費勁,可能需要運行很長一段時間才能查找到,指針的釋放位置自己要記錄好了,忘記了查找起來相當的麻煩。

第二 C語言工具比較少


很多高級語言很多特性都有豐富的成熟類庫,在C語言去實現需要折騰很長時間,這是底層語言不太好的地方,這也就決定了C語言只適合在性能要求比較高的地方去使用,應用研發方面效率很低。

目前來看在嵌入式領域用的還是比較多,特別是在內核驅動,或者操作系統底層實現方面應用的非常廣泛,而且這類對於C語言的要求比較高,不是簡單寫個普通的模塊就能搞定的事情。



總結

基於以上幾點導致很多初學者倒在入門的路上,本質上堅持的力度不夠,誰都不可能在開始學的時候都弄得非常清楚,畢竟天才只有少數。學完之後回來總結C語言也就是十個左右的知識點,懂了也就比較輕鬆了,後續就是靠自己在項目中的打磨了。


您的轉發+關注就是對筆者最大的支持,歡迎關注。

另外喜歡聽互聯網圈裡那些趣聞軼事,或者對大廠架構設計,BAT面試題分享, 編程語言理論這些感興趣歡迎關注筆者,沒有錯。



人人都是架構師


這麼多人學不會C語言你覺得是什麼原因?

是智商原因嗎?那我們來看看,不說全世界了,就全中國而言學好C語言的人那麼多,裡面還有中學學歷的人,你覺得是智商的原因嗎?

是C語言本身的原因嗎?你會說C語言數組、指針、鏈表太抽象,發明者C語言的人太壞了!C語言及其發明人雙手一攤:怪我咯?

很多人學不會C語言的原因,依我看不是智商的問題也不是C語言本身的問題,而是學習者的情商出了問題!你沒看錯,情商!學習C語言需要用到的情商包括:毅力、定力、心理抗壓力和自控力。

這個說來也很簡單,別說學C語言了,你就看看平時在上課時你周圍的人在幹嘛?逃課的就不說了,有睡覺的、看小說的、竊竊私語的、看手機的,別說C語言了,恐怕這種態度連最基本的課程也學不完吧!

你可能會說:“哎,沒辦法啊,現在主流環境就是這樣啊,我如果認真學習會被當成異類的”。可是你想過沒有,畢業後大家就像叢林裡的鳥兒各自飛,誰還管誰?你當時的不好意思的學習,畢業就就是到處被用人單位鄙視到處碰壁。那麼你算一下,是被你周圍的主流環境嘲笑合算還是被決定你飯碗的用人單位嘲笑合算?

學好C語言最主要的因素是情商,其次才是智商,最後才是C語言本身的難度。所以為了你的將來、為了你的家人,你要練好自己的毅力、定力、心理抗壓力和自控力,不光對你的學習有幫助,對你走上社會也是有很大的幫助的。

另外,我在“C語言編程技術分享”這個公眾號裡分享了一些C語言的教學文章,希望對各位有幫助!


數字視聽科普


作為有8年C語言開發經驗的程序員,我覺得我有一點資格可以來回答


首先看什麼叫學會C語言

如果只是簡單的寫出一些循環語句、字符處理等操作,那隻能叫你認識這個語言。

真正的學會C語言,你要理解指針、內存、堆棧操作、鏈表操作,同時需要對操作系統有一定的理解,32位、64位操作系統,使用的數據也不同。


為什麼很多人學不會C語言

1.C

語言的入門簡單,進階複雜,如果沒有操作系統的一些機制理解,那在開發時,會非常頭疼,有時候指針指向某個內存跑飛,你都不知道哪裡出現了異常,這也讓很多人望而卻步;

2.C語言從事的工作比較都比較接近底層,像單片機、芯片開發、內核驅動的開發會用到C語言,需要掌握的知識點很多,一般的公司不願意找一個C語言經驗較低的程序員,這也導致找工作不那麼容易;

3.C語言需要大量的習題和項目練習,否則就是埋坑專家,而且C語言真正能快速做出來的項目不多,不像JAVA可以用現有的框架快速的搭一個前後端出來,或者快速的寫個APP出來,所以學習C語言要耐得住寂寞,不那麼容易有成就感。


為什麼要學C語言

C語言是其他高級語言的基礎。

在日常的工作中,你不可能一直使用C語言,拿我自己來說,我主要從事於Android系統級的平臺開發與高通modem的平臺開發,在日常的工作中需要掌握C、C++、JAVA、Python這些基礎語言,還需要掌握Shell、Soong、Makefile等腳本的開發。而且這些語言和腳本在平臺開發中也是穿插著使用,不同的層會使用不同的語言。C、C++主要使用在Android Nativate C和kernel層 以及高通的Modem層,Java主要用於Android的應用層,Python、Makefile、Soong用於編譯過程。


我剛學習和使用的語言是C語言,有了C語言的基礎,再學習其他語言將會事半功倍。


我們怎樣去寫C語言

我學習C語言的時候,主要是大學的基礎課程,然後自己練習了《C語言經典編程282例》,每道題目都認真練習,弄清算法原理,內存操作機制,異常處理等等,然後再到參與實際項目中進行運用,要邁過幾十上百個坑,才能算是有點成就。


我最近正在寫一個《C與指針心得》的系列文章,想了解C語言的,可以關注我。



IngresGe


沒有練手機會

學不會C語言的主要原因還是C語言的練手機會太少了。

做web或者是桌面應用的練手機會遠遠高於C語言的。

以前桌面應用主要是採用C++進行開發的,現在不要說是否還是C++為主進行桌面程序開發,就連桌面程序都已經進入被淘汰的趨勢,連手機上的應用都是使用Java或者swift等語言進行開發,以後也許我們只能在嵌入開發中才能看到C語言的身影了。

一門語言連練手的機會都沒有,沒有練習的機會就等於沒有精通的可能。

請不要被各種語言排行榜中C語言的高居不下給欺騙了,這是依靠搜索活躍度排名的,因此沒有現實意義。

不過從另一個角度也可以看到這種諷刺,C語言無可取代,工作機會卻那麼少。




一門越來越邊緣化的語言

我說C語言越來越邊緣化,不是說C語言的地位不重要,現在很多的操作系統、數據庫等軟件都是使用C++語言進行開發的,可以說C語言或者C++語言支撐起了當今計算機界,但是令人諷刺的是這個支柱是由少數人構築的。



令人吃驚的是Java這麼流行,而Java這門語音竟然是使用C或者C++開發的,開發Java語言的開發者連使用Java語言的千分之一都沒有。

支撐這個社會運行的根基是由少數人創造的,而讓這個世界更加美好卻需要上千萬人採用最簡單的工具進行打造。

C語言難嗎?



難不難不在於這個語言本身,而在於這個語言本身的環境,C語言的環境是所有語言中最尷尬的,本身的改良和後續的發展遠遠比不上其他語言。

如果你看看其他語言幾年就更新一個版本就知道C語言多麼因循守舊了。

指針也許很難,但是也沒有難到不可逾越,難到不可精通,難到不可克服,既然是人類發明的語言,那麼人類就有可能會學會,一直強調語言的困難,卻不去想想工作不靠它你讓普通開發者怎麼精通?

假如可以依靠C語言養活一大批開發者,我可以保證現在什麼三大框架、微服務肯定是C語言架構的,可惜C不是這樣的語言,它養不活視它為神物的一大批普通開發者。


從頭開始自學java


我本人是一名創業者,同時也是一名編程愛好者,在初創公司有著豐富的工作經驗,歡迎關注我,和我一起分享職場,科技,互聯網創業等方面的知識。

對於你的問題,我的答案是:C語言學起來不難,花點精力學習要入門也容易,但是要真正的用明白就會特別的困難。

筆者接觸和使用C語言編程已經有6,7年的時間了。你可能會問,學了6,7年應該很厲害了吧?如果說到精通或者厲害我真的不敢說,雖然經驗豐富,那也只是達到熟練使用的程度而已,現在在編程的過程中還是會時不時的踩到雷,掉進坑。

為什麼這麼多人學不會C語言,或者是隻懂點皮毛。小編把這些年遇到的一些人和事情與你分享一下便知一二。

學不好C語言大概有這幾類:

一、愛面子,特別喜歡吹牛皮的人

之前公司有一個做市場運營的同事,以前是做技術的後來轉做運營崗。每當公司有做技術的新同事入職的時候,都會問一下新同事技術水平如何,如果遇到畢業生,他就開始吹牛了,吹牛的大概意思就是:之前他幹過幾年編程,然後說編程很簡單,C語言更簡單,如果給他學,兩三天就搞定之類的話。剛入職的新同事當然是一臉懵逼。當你實際和這種人聊的時候,你問他做過什麼項目,一些技術的內幕,他是基本答不上來的。

二、不喜歡專研,沒有耐心,只是為了應付考試和工作的人

有很多畢業生,你問他C語言難嗎,學得怎麼樣?很多人會說:以前學校老師講C語言,我學得很好。老師講的都能聽懂,考試很好。可是當你告訴他們C語言要學會使用很困難的時候,大部分人都是疑惑的。項目中真正遇到問題,他們大部分人選擇的都是逃避問題,沒有去深究出現問題的原因。

C語言從誕生到現在已經很長的時間了,中間經過不斷的優化,最後確定了自己的標準。可是它本身還是存在很多的缺陷的。特別是數組、指針、內存管理這些,在實際運用的時候很容易出現問題。要非常謹慎。

要想少遇到這些問題,最好的辦法就是多多實踐,多寫代碼,經常使用調試工具進行調試。在最初做項目的時候,我曾經為了一個數組越界的BUG無休無眠的調試,直到最後找到了問題為止。

後來我轉做嵌入式底層驅動的開發,開始大量接觸指針。最開始的時候,指針有很多莫名其妙的問題,一不小心指針使用錯誤,指向不該指向的地方,整個系統就會崩潰,那個時候真的不知道痛苦了多少個日月,市場有想放棄的念頭,最後還是堅持了下來。

另外,還有涉及到變量的使用,內存管理,在調用內存塊後還要記得釋放空間,如果忘記就會導致內存空間不足,直至系統崩潰。

以上談的這些只是冰山一角。我不是技術專家,不過我要告訴你的是:聽明白、看明白不代表你懂了,你懂了不代表你會用了,你會用了也不代表你能夠用明白。最關鍵還是要多多去實踐。

不管你要深入任何一門語言,其實都不是那麼簡單的事情,最後以王國維的《人生三境界》與大家共勉。

古今之成大事業、大學問者,必經過三種之境界:“昨夜西風凋敝樹。獨上高樓,望盡天涯路。”此第一境也。“衣帶漸寬終不悔,為伊消得人憔悴。”此第二境也。“眾裡尋他千百度,驀然回首,那人卻在燈火闌珊處。”此第三境也。

喜歡我的回答請關注我,希望我的回答對你有所幫助。請記得在下方留言,我們一起探討。我可以給你更多的參考意見。


社會關注聚焦


可能沒有足夠的動力吧!

如果你學會C語言,別人給你10000塊,你會認真學嗎?或者你不會C語言,考試不及格 學校就不給你畢業證,你敢不好好弄懂C語言嗎?

C語言並不難學,信息時代有很多知識都可以買到,甚至是外國正版書在網站上也是有賣的。還有很多資源都是免費的,比如慕課網,嗶哩嗶哩,還有一些論壇比如CSDN。

實踐出真知,如果僅靠看網課,看相關書籍,你是根本不可能學好C語言的。連編寫C語言的軟件都不去使用,連代碼都沒有敲過,連最簡單的程序都看不懂,何談學習C語言。

事實上,就算是大學老師授課,也不是手把手教的,師傅領進門修行在個人,碰到不會的很正常,不必感到懊惱失意甚至想放棄。我們老師也只是講PPT,給我們演示,然後講完一章就佈置作業 。第一次作業,簡直兵荒馬亂。很多人連如何命名都不會,打開軟件就蒙B,😓。然後就問我怎麼搞啊?我……😓雖然我學習是不錯,你們很相信我,但是我哪知道啊?我也是新手,大家都一樣啊。

沒辦法,打開手機,輸入,如何……,搜索。

奧,找到了,就照著操作唄!

另外,想出類拔萃,你多練習練習打程序,提高手速,能夠盲打最好。經過練習,雖然我目前還不能盲打,但是比起剛開始的手指僵硬,現在確實是能稱得上靈活了。

奧,還有一點,不會就問,沒人能回答就百度,不弄懂你就永遠不會 。不要忘記:千里之堤,潰於蟻穴!


和小九一起走進科技


不是不會而是給你一支筆,一張紙,然後再給你一大墨水,然後他說一句:你幫我把我畫進入!

具體怎麼畫這是你的技術邏輯問題了。

不管任何編程軟件,它們的核心都是不變的,為工作便捷我們需要建模,比如我製作和3D編程器為了有效模擬3D效果,然後與C結合一起就叫3D編程器,它也是個編程軟件也是工具,它不只過是穿有鎧甲的勇士而已,脫掉鎧甲還不是C嗎?建模意思就是模具。

編程器演變過程都是為了工作效率:

這得從芯片製造開始,芯片要設置邏輯指令,開始時候都是一片空白,什麼都沒有,然後設定線路,制定算法,意思就是指令,有了指令我們才可以寫程序代碼,那麼裡面的指令由一一些晶體佈局形成,我要讓CPU認識0和1,那麼如何設置呢?所以用到八進制,八矩陣,擺成01,那麼0就代表著點亮八展燈,然後它們在轉成波形,那麼0佔四個點,那麼波形上面顯示出正玄波,當然由於每個廠商設計不一樣,波形寬度不同,因為他們所佈置的內存不同有的它從右頂邊為一點,中間為1點,這個是製造芯片過程隨便設計的,為的是防盜技術,我拿圖給你製造你也不知道什麼意思。

那麼計算機終於識別0101了,那麼CPU內部設定,0等於一個燈亮,1等於一個燈滅。兩種屬於間接法計算。當你輸入0的時候CPU就知道0是要點亮一個燈,那你要放入不同的位置設定區域,你會用到0*00001+001100位置,後面還有設定區域,在0*11011到0*11001空間,這個和分區一樣的,這就是機器碼編寫。

演變彙編16進制碼,彙編是由機器碼編寫出來的模具,後面地址不在是01000,它改變成01AF81等等,然後用16進制 AF 01 08 09為代表,有的是01 01 01 01 01 BB為一組代表,它們的和或乘除法在轉換二進制,所以彙編指令由左移右移等指令,還有溢出等等。

高級語言C之類語法,屬於公式類型計算,是由彙編編寫出來的模具計算,公式計算速度更快,直接A+B=C C-B=A 就可以了,然後設置個空白區域畫個圖上去,A=這個圖等等表達方式,你為了更高級快速的完成工作你還要建模,也就是我們的應用軟件,隨便寫什麼都可以。

所以編程軟件有很多種正常,但它們核心都是C變彙編,變機器碼,變電信號改變波形長度。每個編程器它們都有指定的工作效率高低,所以每個廠商採購的芯片都用不同的指令,編程方式也有改動,有的直接不支持彙編那麼你的C就用不了,有的還0101都無法編程他們用+-為高低電平,那也沒有辦法是不是。

但是計算方式都是相同的!


與自然做鬥爭


工作量大吧,

不過想想有不大的編程語言嗎?

歸根到底還是,它難以深度學習理解!


因為他們把學習C語言和學習低級編程混為一談。

學習如何真正利用C語言是非常困難。要做到這一點,你必須很好地瞭解現代CPU的工作原理。

例如你要知道一些程序集,知道內存是如何佈置的以及堆棧和堆棧是如何工作的,您應該瞭解內存分配是如何工作的以及如何手動管理您擁有的內存。

而且最重要的是,你也必須知道一堆C語言或者根本不公開的東西,或者是間接暴露的東西(常規性BUG)。您必須瞭解緩存層次結構以及如何讀取內存。

你必須瞭解操作系統是如何工作的。您必須瞭解像SIMD這樣的特殊指令集。

所以理解這大部分知識實際上就是正確學習C語言了。

C語言只是一個工具,你也可以使用其他語言的大部分知識,或者直接編寫程序集,或者通過生成LLVM字節碼,或者通過設計用於低層計算的DSL來實現...

所以如果用C語言編程,那麼你就必須瞭解底層的編程過程,否則用C語言是沒有意義的。

擁有更簡單的基礎,才能構建更復雜的事物!


分享到:


相關文章: