學習C 程式語言的最大難度是什麼

2021-04-14 20:50:30 字數 1534 閱讀 7409

困難度之一

「c++ 是個難學易用的語言」,這句話相信很多人都心有戚戚。c++的學習難度,一在於語言本身太多的「幕」,另乙個就在於 "paradigm shift" (思考模式的移轉)。

傳統語言如 c, pascal, basic, fortran...,除了模樣看起來稍有不同,基本上都是函式 call 來 call 去,大同小異,很容易掌握。你想做的動作,在 code 中都看得一清二楚。你所看不到的,也不過就是編譯器為你的函式加上用以處理堆疊的一小段碼(prologue 和 epilogue),這一小段碼基本上做的是 housekeeping 工作,你沒看到也沒有關係,並不影響你對程式邏輯的思考。

c++ 不一樣,c++ 有太多和程式邏輯息息相關的動作是編譯器為我們加上去的。換句話說 c++ 編譯器為我們「加碼」。如果不識清這一節,學習c++ 有如霧裡看花,霧非霧,花非花。

編譯器為我們的 c++ 程式加了什麼碼呢?很多!物件誕生時 ctor 會被喚起,物件死亡時 dtor 會被喚起,這都是加碼的結果。ctor 中設定vtpr 和 vtbl,這也是加碼的結果。new 單一物件時會產生 memory block cookie,new 物件陣列時會產生乙個內部結構記錄著 object size 和 class ctor...,這也都是布幕後的工作。可以說,程式碼中看不到而卻必須完成的所有與程式邏輯有關的動作,統統都是 c++ 編譯器加碼後的結果。

當「繼承」發生,整個情況變得稍微複雜起來。「多重繼承」又更複雜一些,「虛擬繼承」又再更複雜一些。

這些布幕後的主題,統可歸類為所謂的 c++ object model(物件模型)。如果不知道這些底層機制,你就只能夠把 "make destructors virtual in base classes"或 "never treat arrays polymorphically"這類規則硬背下來,卻不明白它的道理。用一樣東西,卻不明白它的道理,林語堂如是說:「不高明」。只知道 how,不知道 why。

困難度之二

c++ 的第二個學習難度在於 "paradigm shift"(思考模式的移轉)。別說自己設計classes 了,光使用別人的classes,就都是一種思考模式和行為模式的移轉。mfc(或 owl 或 vcl)programmer 必然能夠領略並體會其中的意思。

稍早所說的 c++ 物件模型,偏屬程式設計的低層面;這裡所說的思考模式移轉,則是程式設計的高層面。能夠把新思維模式的威力發揮得最淋漓盡致的,當推物件導向的 polymorphi**(多型)和 generalization(泛型)。如果你沒有使用這兩項特性,等於入 c++ 寶山卻空手而歸。

反覆磨鍊,迴圈**

想像 c++ 是一把用來解決程式問題的刀,要它堅軔,要它鋒利,就必須經過多次的回火,在高熱和驟冷之間——煉。

初學 c++ 語法(syntax)之後,你應該盡快嘗試體驗 polymorphi**(大致而言也就是虛函式的運用)。等到對 oop 的精神有了大局掌控的能力,但對 c++ 的許多小細節不甚清楚,就是回到c++ 物件模型 煉的時機。

成長,是在高階(polymorphi**)和低階(object model)之間反覆**,才能夠**到更高的位階,而不是平平庸庸於中階(c++ syntax)的一灘死水。

學習C 程式語言的最大難度是什麼

困難度之一 c 是個難學易用的語言 這句話相信很多人都心有戚戚。c 的學習難度,一在於語言本身太多的 幕 另乙個就在於 paradigm shift 思考模式的移轉 傳統語言如 c,pascal,basic,fortran.除了模樣看起來稍有不同,基本上都是函式 call 來 call 去,大同小異...

想學習C語言,學習路線是什麼?

不知道有多少人去了解過語言的發展史,早期c語言的語法功能其實比較簡單。隨著應用需求和場景的變化,c語言的語法功能在不斷公升級變化。c語言是一種計算機程式語言。它既有高階語言的特點,又具有組合語言的特點。它可以作為系統設計語言,編寫工作系統應用程式,也可以作為應用程式設計語言,編寫不依賴計算機硬體的應...

C語言中的EOF是什麼?

日期 2011年11月12日 我學習c語言的時候,遇到的乙個問題就是eof。它是end of file的縮寫,表示 文字流 stream 的結尾。這裡的 文字流 可以是檔案 file 也可以是標準輸入 stdin 比如,下面這段 就表示,如果不是檔案結尾,就把檔案的內容複製到螢幕上。int c wh...