為什麼知乎用戶vczh不建議初學編程的人把C作為入門語言?

補充:很謝謝大家的耐心回答,多謝。 我是個新手,大家的回答和建議我也不知該怎麼選擇,不知我的編程之路該如何開始。我想我還要再仔細想想。

同時對這個問題比較關心的同學也可以再百度上搜「第一門編程語言該選誰」,「不把c語言作為入門語言」,可以參考下。

還有這個鏈接:【暢言】不把C作為第一門語言是個好主意么?

【暢言】不把C作為第一門語言是個好主意么?

再次感謝熱心回答的知乎朋友們,謝謝

再次補充:漫漫寒假,如何選擇第一門編程語言?

這個鏈接里的圖真的很贊,關於如何選擇適合自己的編程語言的,不多介紹,看了就知道了


個人看法,如果不打算做專業程序員,不用從c學,如果打算干這行,即使工作上沒用到,或早或晚,都應當學學c。學習c的過程中,會對內存分配有更敏感的認識,即使用別的語言,這也是很重要的。


你可以不聽他的,他怎麼想 怎麼說 和我有什麼關係呢,

C 語言 學得越早越好,當成入門語言也不錯,


我自己學習的體會是,從一門OOP入手會更容易一些。我是從Java進,然後C++,然後C,當然現在也都用的很骨質疏鬆...

java很好學,C++比java難,但是學了java之後理解C++就只需要做一些加減法,再往後學C,把C++面向對象的部分去掉,封裝層次降低,其他部分還是做加減法。如果一開始就學C,可能會被複雜的內存管理和char array嚇死,然後就沒有然後了。C學好以後進階到OOP,還是得從頭適應面向對象的各種概念,也沒有省多少事。主要是內存管理這一塊,OOP的封裝都是比較完善的。對初學者來說,一點都不理解也可以玩一會,等玩到瓶頸的時候適時學C,可能是最有效果的。

不過最重要的還是學,先學啥後學啥頂多影響一下效率和興趣,沒有毅力堅持學下來還是說什麼都沒用。


計算機是很年輕的科學。沒有什麼成熟的課程設計。基本上怎麼讀都能學會。基本上也沒什麼最優路徑。C 語言計算模型簡單。入門未嘗不可。

初學計算機,從哪個抽象層次入手是沒有 ideal solution 的。因為抽象總是存在泄漏 [1]。更高級的抽象可以把程序員從管理計算機的瑣事里解放出來,但是並不能減少學習知識總量。下面有人提到模擬電路,還有人說彙編,其實從業界的現狀來看,C 語言倒有可能是泄漏最少的抽象層次 [2]。

所以不見的抽象層次越高的語言就越利於初學者 ( 也不是越低越有利 ),也不見得越「有趣」的語言越利於初學者。如果你是一個善於嚴密推理的人,從 C 這個簡單清晰的抽象入手是最好的。

  1. The Law of Leaky Abstractions

  2. 再抽象一點 ? 技術奇異點


因為從入門c到用c做出來像樣點的東西這個過程,和更高級的語言相比,不是長那麼一點點。

往往學了語法之後,如果想學應用級開發,就要熟悉系統調用,然後不同操作系統的系統調用還不一樣,如果想搞內核,就需要親自去看內核代碼。

沒有明確的教程,不像學個web框架,都有官方的教程。

所以學習周期很長。

如果只是學習C語法,那還是挺簡單的,但是只學習C語法的話,真的做不出來什麼有意思的東西。


看你想從事什麼了,對於你不打算搞編程的人來說,為什麼要學c呢。加入你將來打算使用java,。net等相對高層一點的語言或者腳本語言,你也沒必要非要學c。假如你對底層感興趣,對編程感興趣,對技術感興趣,喜歡c和c++的底層和對效率的可控性,那為什麼不選c呢。在其他語言中可已經沒有「指針」這麼底層的概念了,同時也意味著艱難和挑戰,需要提醒的是,學了c語言後,你可能發現你依然什麼都做不了!so並不適合功利的和追求立即收益的人從事,所以,你確定你要學c了嗎?


個人親身經歷,現身說法。我2014年還是個對計算機和編程一竅不通的菜鳥。看了《計算機科學導論》和《計算機科學概論》兩本書,對計算機的原理有了了解。就開始學C。大概一周左右,就能用C語言實現基本的數據結構了。

所以,編程入門有兩條道。第一條,計算機原理,有所了解,學C。第二條,直接學其他貼近人思維模式的語言,面向實戰。這兩條路不相上下。雖然第二條不需要學計算機底層的東西,但是有很多要猜的東西,不是很透徹。第一條,開始學計算機基礎要下點功夫,但是弄懂以後,學C就感覺心裡很有底,能夠構建一個統一的自洽的解釋體系。

還有,我個人覺得,學哪種語言快,貌似和個人的思維模式或者思維習慣有關。如果一個人的思維習慣更接近那門語言創始人的話,就會學的快。

貼兩本書的鏈接:

導論:

《計算機科學導論(原書第3版)》([美]Behrouz Forouzan)【摘要 書評 試讀】- 京東圖書

概論:

《計算機科學概論(原書第3版)》([美]戴爾,[美]劉易斯)【摘要 書評 試讀】- 京東圖書

就是這兩本書 對照著看,獲益匪淺。我貼鏈接是為了說明方便,當然你也可以在別處購買。不一定非要在京東。


我覺的C很適合作為入門語言。

可以讓初學者望而卻步,尤其是譚書,一個i++,++i就考你千萬遍。

程序員越少,程序員整體工資就越高,所以C語言成功的擊敗了多數潛在同行。


只上圖不說話


什麼叫入門?入門就是建立一個初步的認識,逐漸深入,並且學以致用,能搞出一些好玩的東西,使你產生興趣。其他對於入門來說都不重要,都是入門以後提高所需的。

我是使用Basic語言入門的,看到編寫一段程序,就可以讓印表機打出一個由*組成的三角形,然後開始學變數,賦值語句,列印語句,條件跳轉語句,循環語句,然後就自己寫出這段程序來。然後再逐步編寫複雜一點的程序。

顯然,那時候我並不知道什麼CPU,什麼內存,什麼指令,什麼寄存器,也不知道比特,位元組,字,但是可以做一些習題,並寫出一些自娛自樂的小程序了。

而C語言是一個中級語言,只有了解計算機底層結構才能掌握好這門語言,什麼指針,數組,字元串,指針的數組,數組的指針,讓初學者非常頭疼。也很容易出錯。所以我上學的時候,Pascal比C語言更適合做為教學語言。

我覺得也不適合用強調面向對象的語言做入門,一下子太多語言特性了,什麼對象,類,虛函數,純虛函數。完全搞不清楚為什麼要這麼多概念。C++尤為不合適。

現在來說,我覺得Python,Ruby之類的語言比較適合入門吧。


這就好像,你要吃飯,有幾種選擇

1. 一包速凍餃子

2. 米飯,雞蛋,火腿,蔥,黃瓜

3. 一頭豬,一大捆稻子,各種工具

4. 一把種子,一隻小豬仔,肥料和飼料若干

1基本上相當於VBA和腳本語言

2大概是所有的OO語言,主要是java和C#。

python和ruby介於1和2之間。

3是C和C++

4是彙編

你說你幹嘛要學C入門?

-------------------------------

補充一下

如果你想成為一個真正的大廚,你依然需要知道豬身上每個部位的肉適合做什麼吃的(比如你用五花肉燉湯,或者用精瘦的裡脊做紅燒肉,效果都會是災難)。光知道有「火腿」這種東西顯然是不夠的。

但是第一,大廚都是從不會做飯的普通人慢慢學出來的。所以,你得給他學的機會。另外,他未必要一開始就做一個專業的廚子——他有可能是業餘做飯過程中養成了興趣,才想繼續鑽研的。

第二,這個世界上90%的人只是想隨便吃點東西填飽肚子;剩下的里,9%的人想學做飯但只是業餘改善生活;只有剩下的1%真的想當專業的大廚。你逼著前邊的99%去學殺豬,不學會不給飯吃,那就……呵呵。

咱們的計算機教材實在太老了,思想也還停留在幾十年前。沒辦法。


上手用C猛如虎,就是容易體會不到編程的快樂,因為附加要求知識太多了,容易摧殘想編程的心。


c語言(語法)很簡單,可是你光知道語法就能寫文章嗎?要能用c做項目,要學的知識太多太多了。

不說其它,操作系統至少得1-2年上軌道吧?

稍微能做點事情的c項目需要工程經驗,構建工具,調試技能,紮實的基礎知識。這些在學校幾乎沒法學到。

舉個栗子,某次c語言課,某女生回答問題,大家發現她居然把ascii碼錶背下來了..背下來了..

這不算完,老師投去了讚許的目光,同學們也都是崇拜的表情。

這樣能學好c語言嗎??就不吐槽譚某強的++--++----++了。


有課就認真上。

課餘娛樂就python 或者c#


底層的東西應該長大了之後才研究,不容易誤入歧途。當然了,等把幾個高級的語言玩熟了,研究底層的東西不用C也可以了。我小時候就是直接跳過C搞彙編,反正我現在也從來沒寫過正經的C程序,也從來沒試圖去搞明白C裡面有什麼東西是C++沒有的,C++有什麼東西是C沒有的。

所以C語言並不是必須要學的,如果你的工作不強迫你一定要用純粹的C語言的話。


為什麼不建議?我就建議,只要是因為興趣入行,打算把編程當終身職業的人。C在語言層次剛剛好,不像一堆高級語言封裝一大堆模式框架,又不像彙編那樣機器依賴細節過多;語法複雜度夠簡單,就那麼幾十個關鍵字;語言範式單一的函數式,讓焦點集中在解決問題的思路本身,哪點不好?

補充一句,C作為一門編程語言,所處的位置恰恰好把所學的計算機組成、操作系統、演算法、網路基礎等知識面串起來。相比而言高級語言的優勢是在處理大型系統、複雜業務邏輯,這作為初學者來說還不到這個層次需要去關心這些的。

老婆孕吐,被弄醒起來給她做了碗粥再墊吧下,反正也睡不著了再第二次補充。

我在這塊給真正這個問題能幫助到的初學者的建議是要去學,把能否學成C當做對自己的一個檢驗。看了下其他同學支持不建議的理由,個人恩怨和個人崇拜的我就直接過濾了,主要是上手慢,成就感不足。原因是要真正用C解決的問題通常要了解掌握很多其他知識,比如上面提到的計算機原理、操作系統、數據結構、演算法等等,這些東西太煩了。可是,要把編程作為自身職業規劃的人來說(僅僅是嘗試、好玩、作為自己主業的輔助技能的請繞道,這種你怎麼感到愉悅怎麼來),想在編程這條路上走的遠是不可能繞開這些東西的。

作為程序員自身的發展路線大體上兩條,一是走技術流派,在入門後不管要走哪個領域專精想提升很快就會遇到瓶頸,到時候還是不得不回頭來補這些所謂枯燥的知識體系;二是以後逐漸轉向技術性管理人才,可是同樣逃不開對自身相對完善的知識體系的要求,帶著那麼三五號人做過項目就算經理,別逗了,那是老闆和HR忽悠你呢。要做技術性的管理人才,好歹得對項目整體方向、路線、方案,項目進度、風險有宏觀把握吧,沒有基石你的分析、掌控從哪兒來?你的價值和不可替代性從哪兒體現? 你說純管理崗位? 同學,那你還學什麼編程?職業經理人在向你招手。

見過太多都30多歲的人了,還是只會用著xx語言,把控制項拖來拖去,解決不了任何有點難度的技術問題的所謂「庫程序員」,一個月拿著幾千塊,更可悲的是你看著他就知道只要還干這行,基本不會成長了。難道他入這行的時候就想這樣?

所以,為什麼我要建議初學者從C入手,你可以學會了不喜歡,以後在工作中也可能很少用。但如果你發現自己邏輯思考能力不夠學不會,對後面那一大堆東西就是感到枯燥就是不感興趣,真的,這個行業作為職業真的不適合你,找一個適合自己的職業,把編程當成愛好或者第二技能是個不錯的選擇。拖幾個控制項,寫幾行不過腦子的代碼快速完成一個軟體的愉悅感是在誤導你,沒有人想在自己的行當里長期被視為廉價勞動力,對吧?

----------------------------------

第三次補充。

在假想中我的回答針對是「要把編程當做自己職業」的同學的。例如 張宗尉 ,李仁海 的回答,他們說的學習曲線一點都沒錯。但是他們站在的是一個全局視角,或者說上帝視角。編程,或者每個行業的人才組成,最後都是一個金字塔形狀。一個職業總是大浪淘沙,把人分出三六九等,但我想分享的是「通過一些方法儘早發現自己是否適合,也千萬不要選錯行,等到失去選擇機會的時候,讓自己成為墊底的那一批人」。我有點跑題了,抱歉。


一家之言,不必上心。


其實我覺得C和彙編是最好的入門語言

要說圖靈完備,很多遊戲里都有內置的機制能做到,但是你不能說玩那些遊戲就算會編程了。你只有或多或少像操作系統一樣很底層地和硬體打點交道(最少要操作unmanaged memory)並完成有一定複雜度的任務才能算開始學編程了。編程的第一步是用低級方式操作電腦,不是寫演算法


C語言簡練但是枯燥。

你看C#、http://VB.net,拖拖按鈕什麼的就能做個交互,比黑框框白框框直觀不說,依賴強大的類庫還能寫點小程序解決日常問題(比如製作一個SPAM批量發送機...),多棒!興趣來了自然就會繼續學下去啦~

好多人抱著《C語言程序設計》糾結半天++++----++結果混了個二級,卻不知道這玩意兒特喵的能幹嘛...這嚴重挫傷積極性。

現在都覺得當初自學的http://VB.net而不是C真是萬幸。(逃


第一門語言應該是機器碼或彙編。

然後再學習C

最後學C++和各種動態語言

事實證明,輪子有時候是靠不住的。


推薦閱讀:

C語言的取余運算 a%b,如果a<b,那取余a,2%3=2,25%26=25,這是為什麼,規定?
開源代碼里某個函數很長,這種代碼能否認為是好的?
64 位系統中 long double 的最大值是多少?
有哪些適合學習的開源項目?
學c語言該怎麼入門?

TAG:編程 | C編程語言 |