不少人都喜歡把C語言推薦給初學者,緣由就是C語言語法簡單。可是C語言如果用於開發之中,倒是最複雜的語言。php
C語言提供了對底層的操做,好比指針。可是C語言跟C++最大的不一樣就是,C語言避不開指針,而C++和用STL和智能指針庫徹底避開它。也便是說,其它語言的指針只是個類型,C語言的指針就是指針。我一貫認爲,初學者過早接觸指針是個大忌。初學者須要的是作出各類好玩的應用,以此來產生即時反饋,而不是深刻研究計算機系統,由於後者只會消磨掉他們的信心。初學者就應該專一於代碼邏輯,而且屏蔽掉和底層打交道的一切事物。這麼作個比喻吧,若是你剛學化學的時候,就給你講元素週期律和VSEPR模型,你會感興趣嗎?java
暴露底層從另一個角度來講也是有害的,這涉及到手動管理堆中內存。計算機講究的是一個權衡,你能夠說這種方式執行效率高,可是大多數狀況下,過分追求執行效率而忽視開發效率是不對的。手動管理內存是高級程序員的事情,初級程序員就應該徹底交給語言所帶的特性來管理內存,不然,你的程序三天出一個空指針異常,五天出一個內存泄漏,這誰受得了?因此c語言不管從哪點來講,都不適合拿來入門。c++
還有一種見解是,只有c語言能接觸到棧和堆的模型。我很負責任的告訴你,全部非腳本的編譯語言,好比c++和swift,以及託管語言,好比c#和java,都能接觸到棧和堆的模型,並且因爲有了自動內存管理機制,後者使用堆的頻率要遠遠高於C。腳本語言也有本身的變量容器模型,好比php的zval。這個鍋不該該由編程語言來背,而是應該由國產的垃圾教材來背。也能夠看出來,c語言的堆棧模型不是放之於四海皆准的,若是拿它去套在其它語言上,可能就行不通。可有些人非要拿它看成學習其餘編程語言的基礎,真是好笑。程序員
C語言不提供一些通用組件的高級封裝和抽象。好比哈希表,你用的時候徹底就得本身造一個,或者上網搜搜看有沒現成的代碼。這就對開發者很不友好了。因爲C語言標準庫裏面沒有這個東西,學的時候徹底不會說起,這就致使不少人甚至都不知道有這麼個東西,遇到問題的時候就只能乾瞪眼了。C語言僅僅支持的容器是原生數組,字符串是用原生字符數組實現的,因而對字符串的處理就很是很是弱。你要是想寫個字符串拼接的代碼,java裏要一行,c語言要好幾行。這也就是c語言「簡單」帶來的代價。編程
C語言的簡單偏偏是省略掉了OO的原生支持換來的。我上面爲何說是原生支持,是由於C語言仍是能夠用組合的方式實現OO的,好比繼承用組合實現,虛函數用指針函數成員來實現,等等。在OO的方面,C語言實現起來要比C++可貴多。C++的一個關鍵詞,對應到C語言又是幾行代碼,何談簡單呢?OO好也罷,壞也罷,它是如今業界通用的語言範式,其做用就像天然語言中的英語同樣,舉足輕重。若是不接觸一下這個,之後找工做的時候就很吃虧。可是OO真的複雜嗎?這些東西,你若是去翻java的書,頂多花兩章介紹,一章是類,一章是接口。其它不那麼OO的語言乾脆就花一章了,就是告訴你有個class,而這些篇幅也差很少是C語言教程中結構和枚舉的篇幅。swift
C語言的「簡單」,就意味着實際開發中,你須要作更多的手動操做來代替編譯器。我想上帝是公平的,給了其它語言更多的語言特性,就會同時給他們更高的開發效率。c#
C語言書薄的緣由,不是由於沒有OO那些東西,而是標準庫中缺乏一些現代化的組件,這些東西可都在posix裏。離開posix api談C語言,就是耍流氓。通用的組件或設施,到了c語言這邊,一個都不會少,由於現代的程序運行環境和需求,你離了這些東西,就根本寫不出什麼來。現代編程語言的五大庫(字符串、容器、io、線程、網絡),c語言就坑掉兩個了。至於後面那兩個,C語言開發者不得不去使用posix api,而後再去解決api不兼容問題。以C語言標準庫的德性,離了posix就是半殘。而若是要了解posix,就得看《apue》。你若是跟我說C語言簡單,看完《apue》那一大厚本書,再跟我說簡單吧。api
咱們學一門編程語言並非要拿來應付考試,而是要實際作東西的。像C語言這種沒有容器、沒有string、沒有模板、沒有異常、沒有RAII,全部輪子本身造,毫無現代編程語言特性的語言,真正用的時候複雜到爆。抱歉,我沒有時間去研究每一個特性或者類在C語言裏怎麼實現,我仍是喜歡用更簡短的代碼來表達個人邏輯。數組
哪裏簡單呢?寫玩具程序簡單嗎?網絡