K&R中有哪些過時的地方?jx yang2015-10-21 20:43:11

main不宣告返回值,實際也不返回一個值,使用函式不先宣告。不過這些錯誤TCPL的第二版已經修正了。

K&R中有哪些過時的地方?薛非2015-10-21 21:15:59

以下評論基於K&R第二版。

1。

函式型別宣告位置不當;

2。

有些概念不準確,與現代C語言吻合度不夠,容易使初學者誤解。

例如指標是一個變數這種說法。

【補充說明:

1。

“把指標稱為指標變數”這種說法使得很多人看到指標也不認識。例如

int i;

那麼&i就是指向i的指標,型別為int *,然而&i並不是變數。很多人認為只有

int *p;

中這樣的p才是指標,卻不懂得&i和p在運算上除了前者不是左值不能進行(被)賦值、++等運算,其實運算上兩者是完全一樣的。

似地,凡是接受了指標是變數這種說法的人,通常也不清楚陣列名、函式名以及StringLiteral在多數場合下也是指標,他們往往需要繞很大的圈子才

能勉強理解這些資料的相關運算。例如,*(“abcde”+1)、“abcde”[2]這樣的表示式,如果不知道“abcde”在這裡就是指標型別,會感

到幾乎無法理解。而一旦懂得了指標是一種資料型別,“abcde”是char *型別,理解這樣的表示式易如反掌。

2。

實際上K&R所說的“變數”,並不是通常意義上的變數這個意思。K&R表達的意思是指標也是如int、double等一樣的資料物件(Object)。但在K&R那個年代,C語言的概念沒有今天這樣清晰明確。

3。

根據C11標準,

A pointer type may be derived from a function type or an object type, called the referenced

type。 A pointer type describes an object whose value provides a

reference to an entity of the referenced type。 A pointer type derived

from the referenced type is sometimes called ‘‘pointer to T’’。 The

construction of a pointer type from a referenced type is called

‘‘pointer type derivation’’。 A pointer type is a complete object type。

不難發現,現代C語言是把pointer視為一(大)類type的。

3。

優先順序和結合性問題:

K&R沒有正確區分字首++、——與字尾++、——,錯誤地把它們混為一談,深究起來是會出問題的。

4。

變數宣告位置問題

早期的C語言,區域性變數只能在Block一開始的位置宣告,現代的C語言已經沒有這個限制了。

5。

for (int i =0;;){}這種寫法很爽,但這是K&R時代的C所沒有的。

==============================================

感慨:對K&R的迷信盲從與對譚浩強之類欺世盜名的騙子的迷信盲從其實並沒有本質區別,後者並不比前者更可笑,兩者都是喪失獨立思考能力的一種表現。

K&R中有哪些過時的地方?匿名使用者2015-10-21 22:19:22

過時倒也沒有,這麼薄的書不可能講太詳細清楚,作者又是省話小王子,所以算不得很好的一本入門書籍。

有些個人習慣問題也是不值得學習的,比如if語句塊只有一行程式碼的時候就不寫括號了,幾十年後寫OpenSSL的那幫人……

K&R中有哪些過時的地方?假藥郎中2015-10-22 09:21:11

我一直認為K&R已經不是一本好的入門教材了,雖然它曾經是最好的。之所以這麼說,並非因為它在C語言層面上的一些“過時”之處,那並不重要;而是因為它所面對的讀者群已經完全變了。

C語言最核心的利器就是在記憶體中無所不能的指標,透過適度的抽象大大簡化了組合語言中各種繁瑣的定址指令,從而成功地取代了組合語言,成為系統程式設計的首選。K&R在成書年代所面對的讀者主要就是那些彙編程式設計師。對於那些人來說,記憶體操作是他們的基礎技能,指標則是一種更方便好用的操作記憶體的工具。所以K&R根本無需在記憶體操作方法上更多著墨,只需要講清了指標的語法,那些程式設計師便能運用自如。

但如今時代,幾乎所有的程式設計師都是靠高階語言甚至指令碼語言喂大的,對於記憶體操作的理解十分薄弱,光靠K&R書中那點篇幅的講解,只能教會他們指標的語法,並不能教會他們指標的“用法”。以至於很多人在學習了指標後,仍然會很茫然的問:“指標有什麼用?”

所以我很推崇《C和指標》這本書,雖然它也已經屬於“高齡”圖書,有不少“過時”之處,同樣那並不重要。這本書的最大優點就是,有一半篇幅都在手把手地教你指標的各種“用法”,這才是C語言初學者最需要學習的。

至於K&R,它的歷史地位已經無可撼動。但對於如今的程式設計師,它更適合用來膜拜,而不是學習了。不適合當今的程式設計師,可能這就是K&R最“過時”的地方吧

K&R中有哪些過時的地方?Coldwings2015-10-23 01:00:57

我覺得K&R介紹的C語言挺好的,因為它介紹的是C語言本身,是編譯器對這些個語句的理解。它很好的說明了C語言本身的特性:指標與資料的轉換,名字與內容的關係,運算子、函式、結構體、全域性變數與區域性變數、基本型別,這些就是C語言該有的東西了。它還順帶介紹了一下在主流PC上的C語言裡常用的一些庫和一些相關約定,已經足夠了。

至於格式標準,這種事情參考編譯器文件就好。C語言跟C編譯器是完全兩回事,後者只是前者的一個實現而已。不介紹多執行緒多程序並行?那也不是語言的事情,而是相應的OS級API和一堆子庫的事情。我會C++不一定就要會MFC,我就算寫介面也只用來寫Qt;我會C#不一定就要會WPF,一般撐死也就玩玩Unity;我會Python不一定就要通曉Flask,我會做計算寫模擬能駕馭Tornado和Django;我會javascript也不一定就要懂jquery,我會react和node……那憑什麼我會C就一定要求教材裡要把平臺相關的多執行緒多程序全給你解釋清楚呢?

居然還有吐槽說主函式返回值和指標與變數關係的……函式返回值這是OS規定的,是編譯器行為,您要趕巧在微控制器上用Keil C寫個程式,倒是告訴我看看返回值返回給誰?

指標怎麼就不是變量了?指標實實在在的佔用了記憶體空間,編譯器規定了指標的型別,常見OS的編譯器裡指標就是個與OS字長相同的無符號整數,你可以對其取指向的內容,同時也可以改變指標本身,難不成你覺得指標是個宏?那麼我告訴你,C語言規定了變數間的強制型別轉換,這個轉換是基於記憶體指向的,你要願意的話完全可以拿個隨便什麼型別取其指向的記憶體空間的資料並且用任意型別去讀取內容,這完全對應彙編的取值與取址。C的最大特點就在於,在不開最佳化的情況下,你的C語言語句跟彙編指令是完全一一對應的。C管任何實際存在記憶體中的有名字的東西都叫變數,變數名只是對應的一個記憶體空間的關係繫結而已,不是啥指令碼語言裡的引用。

很不巧,我學程式設計很早,在家父薰陶下也很早認識了彙編,明白CPU到記憶體的工作原理,同時我也會十來種程式語言,明確的理解語言就是語言,編譯器就是編譯器,規範、約定和實現都不是語言本身應該背的鍋。你想要規範化體系化,請去仔細學習相關規範和開發模式;你想要各種功能,請去看相應的庫的文件;你想要知道特定平臺下的編譯器工作特點,請去看編譯器文件,不要把什麼事情都往語言上推。

這麼一看,是不是應該覺得K&R才是真正的最純粹介紹語言本身的C語言教程呢?