我的新書《C語言非常道》

2021-09-21 18:51:31 字數 2603 閱讀 5925

毋庸置疑,c是非常流行的程式語言。正是因為流行,和它有關的圖書之多,可以用多如牛毛、汗牛充棟來形容。

既然都已經這麼多了,那我為什麼還要再來一本,給牛增加負擔呢?原因很簡單:想看看是否能用一種和別人不同的方法來把c語言講清楚。這本書面向初學者,但是,已經學過c語言的人也不妨讀一讀,因為我的講解方法和對很多問題的闡述和別人不一樣。請放心,我們不胡來,c語言有自己的標準,我們始終按標準來解釋一切。 當然,自負是人類的共性,這本書是否真的能把c語言講清楚,還得靠讀者來檢驗。

c語言難學嗎?來自這個行業的聲音始終自相矛盾。一方面,很多過來人聲稱c語言其實很簡單;另一方面,很多初學者覺得很難,不得其門而入。僅就語法而言,c語言確實比較簡單。但是,這種簡單性使得很多人對它的掌握只停留在似是而非的表面上。似是而非的學習一開始很輕鬆,但你走不遠。實際上,即使是聲稱已經掌握了這門程式語言的人,對很多語法要素的認識和理解也是錯誤的,在書寫稍微複雜一些的**時,也發現自己突然變得糊塗起來。

那麼,學習c語言的訣竅在**呢?

首先,掌握它的型別系統並學會以型別的觀點來構造和解析程式中的**,這樣你就不會迷路。如果你沒有掌握c語言的型別系統,不會從型別的角度來分析乙個表示式,說明你並沒有掌握c語言。

其次,你要了解c語言在整個計算機系統中的位置,知道它和作業系統或者硬體之間的關係;尤其是要理解庫和c語言的關係,要明白是庫拓展了c語言的實用性。除了c語言本身的簡潔、優美和強大的表達能力外,c標準庫和其他形形色色的庫也是c語言變得流行並威力無窮的重要因素。

寫一本程式語言的通俗入門教材,最痛苦的莫過於你不能一下子展現事物的全貌和眾多細節。儘管你知道它,也渴望表達,然而毫不客氣地說,讀者們並不需要它。讀者不了解原委,沒有耐心,記不住,而且恐懼。為此,本書力求在以下幾個方面做一些突破:

首先,c語言的知識點是網狀的,是互相牽扯和交叉的,如果不加以梳理,隨著閱讀的深入,讀者不理解的概念和術語將越來越多,從而產生挫敗感。為了克服這一問題,我們把它變成線性的,還沒講到的內容一概不提,沒講過的概念一概不用;講過了,有印象了,掌握了,再用來解釋新的知識。

其次,對於一本c語言的圖書或者教材來說,最怕的是陷於細節而無法自拔,這往往會使讀者成為語法機器而不能領略c語言的全貌,不知道c語言到底有什麼實際的用處,更不知道哪些知識才是最重要的。

第三,考慮到型別系統的重要性,從本書一開始就逐漸強化型別的知識和基於型別的語法分析。這是掌握c語言的關鍵,不可等閒視之。

第四,多數教材和圖書都從乙個令初學者抓狂的語句

printf ("hello world"); 

開始,其理由是初學者可以馬上看到「成果」,增加他們的學習興趣。然而,除非是面向有程式設計經驗的讀者,否則這樣做可能弊多利少。一方面,printf只是乙個普通的輸入輸出函式,而且並不是c語言的組成部分,但初學者可能會先入為主地認為它就是c語言裡的大樑;另一方面,這個函式並不是它表面上看起來的那樣簡單,實際上涉及多個知識點和概念,而且無法在一本書的開始部分完全展開。對於初學者來說,從一開始就將他們引入乙個迷局可能並不值得。

考慮到這些,本書一反常態,將輸入輸出留到第6章單獨講述。在此之前,我們用除錯軟體來跟蹤程式的執行過程並觀察執行結果。事實上,程式除錯是非常重要的技能,所以本書這樣安排應該是科學的。

第五,本書有一章是專門介紹windows程式設計的,雖然如走馬觀花一樣簡單,也會令某些讀者質疑,畢竟c語言無關具體的硬體和作業系統平台。之所以這樣安排,主要的目的是讓讀者領略c語言是如何在具體的平台上發揮作用的,以及庫在這個過程中所起到的作用和扮演的角色,並從乙個側面解答c語言到底有什麼用的問題。儘管c語言不依賴於平台,但用c語言寫出來的程式卻需要在具體的平台上執行。

第六,本書引入了很多概念和術語,但在正文中夾雜這些術語的英文拼寫可能會對部分讀者造成閱讀障礙。考慮到這一點,我們在每一章的前面用思維導圖單獨列出,這樣做的另乙個好處是可以讓讀者清楚地知道本章中都講了哪些內容。

第七,這本書開篇沒有講c語言的由來、歷史、優點和應用領域,通常來說,這是一本c語言教材的格式化組成部分。但考慮到別的書都已經講了,網路上也到處都有,所以我就沒必要再囉唆了,請大家不要見怪。

最後,這不是一本類似於辭典或者語法參考手冊之類的書,內容的組織具有漸進和逐步展開的特點,應該從第1章開始順序閱讀。在內容的組織上,本書前半部分以如何實現輸入輸出為主線:第1章引入c語言程式設計的基本概念和要素;第2章講解程式的除錯;第3章快速介紹c語言裡的大部分表示式和語句型別;第4和第5章介紹指標和陣列,為輸入輸出做最後的鋪墊;第6章完整介紹輸入輸出。在積累了相當的知識和經驗後,本書後半部分以如何實現漢字的處理(第7章)、如何編寫windows程式以及編寫乙個複雜計算器為主線(第8、9、10、11章),繼續講解c語言的語法。為方便起見,第12章詳細介紹了c語言裡的每一種表示式。 

在學習這門程式語言之前,必須先了解計算機的工作原理,有使用計算機的經驗。對於大學新生來說,我並不擔心這一點,學校自有他們的教學計畫和進度安排;對於自學這門程式語言的人來說,這是需要注意的。

在即將出版之前,編輯同學希望我能在前言裡提一提我以前寫過的書。說白了,就是要做做廣告。我當時就大義凜然地一口回絕:「此事決不可為!謙虛謹慎乃做人之根本,休想讓朕把寫過《穿越計算機的迷霧》和《x86組合語言:從實模式到保護模式》這兩本書的事說出來!」

王曉波和李雙圓參與了本書的寫作,我們在此共同祝願讀者們閱讀愉快,早日通過本書掌握c語言的精髓。

李  忠           

2023年1月6日於長春   

**: 

電郵:[email protected]  

《C語言非常道》李忠

毋庸置疑,c是非常流行的程式語言。正是因為流行,和它有關的圖書之多,可以用多如牛毛 汗牛充棟來形容。既然都已經這麼多了,那我為什麼還要再來一本,給牛增加負擔呢?原因很簡單 想看看是否能用一種和別人不同的方法來把c語言講清楚。這本書面向初學者,但是,已經學過c語言的人也不妨讀一讀,因為我的講解方法和對...

一道C語言題目,我的解法

題目 編寫一函式expand s1,s2 用以將字串s1中的縮記符號在字串s2中擴充套件為等價的完整字元,例如將 a d擴充套件為abcd。該函式可以處理大小寫字母和數字,並可以處理a b c a z0 9與 a z等類似的情況。在main函式中測試該函式 從鍵 盤輸入包含縮記符號的字串,然後呼叫該...

我的新書終於要出來啦

我的新書 大話重構 終於要出來啦!這是一本講咱程式設計師應該怎樣開發高質量 的書,它用大量精彩的故事,講解高質量的 是怎樣一步一步開發出來,其設計的過程 心理的歷程 遇到的問題 解決的思路 這是一本解惑的書,它通過故事向你闡述許多深邃難懂的設計難題 這又是一本故事會,它將那些枯燥的技術問題通過故事娓...