繞開C語言4個大坑,這個學習順序要牢記

雖然 C 語言是眾多初學者進入程式設計世界的首選語言,但真正透過C 語言入行的人並不多,甚至不到“望 C 止步”的一半!

中途而退的人都說難!難!難!難上加難!看了很多專業書籍、記錄重點知識點,最後卻無法真正運用到實際專案,時不時bug,斷連……

而 C 程式設計師則是相反的說法,認為“這是一門勤能補拙的語言”,他們在開始學習的時候,除了看書,還要花時間去同步練習,就和學數學一樣:

先看理論,再去練習實踐,從而掌握。

C 語言不單是程式設計世界的敲門磚,還是其他語言的敲門磚,當你學好C語言之後,接下來無論想進軍Java、C++、C#、還是Python、Go、PHP、JavaScript 等語言,都會輕鬆不少。

— 01 —

C語言為什麼學不好

經常聽到大家嘶喊:眼睛學會了,手卻跟不上操作!這是為什麼?

儘管C 語言如此火爆,學習的人也很多,縱使沒有“望 C 止步”,但能運用自如的卻遠遠不到一半!

無論是C++、Java、Object-C等其他很多語言,在語法特點上都很C語言類似,學習C語言更能為我們打好程式設計的堅實基礎。

作為一門歷史悠久的程式設計語言,C語言有著其他語言無可比擬的廣泛的應用領域,小到“Hello World!”,大到作業系統,C語言的工作場景處處可見。學好C語言將大有可為。

C語言強調的面向過程的問題分析方法,更是培養我們思維靈活性和嚴謹性的最佳途徑。

C語言靈活多變的語法更是一柄雙刃劍,一方面它能夠充分發揮程式設計師的個性、提高工作效率,也提高程式執行效率。但是另一方面,C語言也能帶來一些問題,其中最大的問題就是,學習了卻無法應用到實際專案…………

因為你只是單純地學習了理論知識,沒有去透過練習來真正掌握這些知識的核心!

常見的“坑”

哪一個編譯器更好?

GCC 還是Visual C++?

哪一個IDE更好?

Visual Studio還是 Vim 或者 emacs?

這個表示式的結果到底是多少?

可能是這個?

有問題沒搞懂,該怎麼辦?

找網路幫麼?

對於初學者來說,最重要是有一本讓你能夠

系統全面地從基礎學起還能提供每個階段相對應的練習題及答案的一本書

,而這些“坑”在初入門時並不那麼重要。

學習C語言的順序

(1)選一本好的入門書,系統地學習。

(2)動手去上機操作和練習,對答案,任何理論知識都需要實操驗證。

(3)正確認識和理解C語言,把握學習的重點,避免分散精力。

從最基礎的語法(

變數、字串、條件、迴圈、陣列、函式、結構體等

),再到高階的演算法(

指標、記憶體管理等C語言中至關重要的兩大標準

),循序漸進。

確實,大家在學習 C 語言的過程中,往往忽視了最重要的一點,

看書很重要,但配套的訓練同樣不容忽視

,兩者結合起來同時進行的才能快速提升程式設計水平,最終達成學習的目標——在實際專案中運用。

而學習 C 語言恰恰就是一個堅持

看、敲、寫

的過程,缺一不可:

1)多看書學習

不能僅僅記住那些名詞,那些規則,程式設計語言的重點在於應用。在應用中去總結和體會,用自己的語言去定義那些名詞術語,用自己的語言去概括那些語法的規則和意義。對,就是不要“你覺的”,而是要透過學習領會“你覺的”,最終到達“自己覺得”!

2)操作和練習

C語言是一門工具,我們要在不斷的操作和練習中熟悉工具的效能、使用方法和使用技巧,僅僅停留在紙上談兵的程度,是遠遠不夠的。

3)拓展知識面

C語言雖然是一門高階程式設計語言,但是它還是涉及很多計算機系統底層方面的知識,最典型的例如指標,多瞭解一些計算機原理方面的知識,拓展自己的知識面。

4)多做練習

不能僅僅停留在編碼上,程式設計的重點在於設計。做習題時拿起紙和筆,整理自己的思路,記錄自己分析問題和解決問題的想法。過段時間再來看看自己曾經的想法,評價一下,也就是說,學習C語言,要反覆多次地進入學習。

5)反覆學習

學習C語言,要反覆多次地進入學習。每過段時間再來整理自己的所學和曾經的想法,

第一次,重點在於瞭解基本語法和知識點

第二次,在練習中體會基本語法和知識點

第三次,系統觀的練習和設計思想的鍛鍊

逐漸在學習中培養自己的邏輯思維能力。學習自頂而下的分析方法,學習嚴謹而全面的流程控制。學習其他優秀工程師的思維技巧,將會是我們受益終生。

例如:字串與格式化輸入/輸出,我們應該這樣去進行練習、實操,從而鞏固我們從書本上學到的理論知識,只有這樣才能掌握它的核心!

1)假設一個程式的開頭是這樣的。

#define BOOK “War and Peace”

int main(void){

float coast =12。99;

float percent = 80。0;

請構造一個使用 BOOK、coast 和 percent 的 printf()語句,列印以下內容。

This copy of “War and Peace” sells for $12。99。

That is 80% of list。

分析與解答:

程式要求列印帶雙引號的字串,因此在 printf()函式中需要加入轉義序列\“。此外,80% 需要使用浮點型資料 percent,列印時需要新增修飾符,百分號的列印需要使用轉換說明符號%% 。具體程式碼如下。

*/

#include

#define BOOK ”War and Peace“

int main(void){

float coast =12。99;

}

float percent = 80。0;

printf(”This copy of \“%s\” sells for $%。2f。\n“,BOOK,coast);

printf(”That is %。0f%% of list。\n“,percent);

return 0;

2)列印下列各項內容要分別使用什麼轉換說明符?

a.一個欄位寬度與位數相同的十進位制整數;

b.一個形如 8A、欄位寬度為 4 的十六進位制整數;

c.一個形如 232。346、欄位寬度為 10 的浮點數;

d.一個形如 2。33e+002、欄位寬度為 12 的浮點數;

e.一個欄位寬度為 30、左對齊的字串。

分析與解答:

a.整型資料使用轉換說明符%d,欄位寬度與位數相同不需要使用特殊修飾符,因此轉 換說明符為%d;

b.十六進位制資料的轉換說明符(輸出大寫字元應當使用大寫 X)是%X,因為寬度是 4, 使用 4 作為修飾符,因此轉換說明符為%4X;

c.浮點型資料轉換說明符是%f,10 位,小數點後有 3 位修飾符,應表示為 10。3,因此 轉換說明符為%10。3f;

d.顯示指數使用轉換說明符%e,欄位寬度為 12,小數點後有 2 位的修飾符,應表示為 12。2,因此轉換說明符為%12。2e;

e.字串使用轉換說明符%s,長度為 30,左對齊,使用−30 修飾符,因此轉換說明符 為%−30s;

3)列印下面的內容要分別使用什麼轉換說明符?

a.欄位寬度為 15 的 unsigned long 型別整數;

b.一個形如 0x8a、欄位寬度為 4 的十六進位制整數;

c.一個形如 2。33E+02、欄位寬度為 12、左對齊的浮點數;

d.一個形如+232。346、欄位寬度為 10 的浮點數;

e.一個欄位寬度為 8 的字串的前 8 個字元。

分析與解答:

a.unsigned 型別整數轉換說明符是%u,對於 long 型別欄位寬度,應新增 l 修飾符,字 段寬度為 15,就需要新增 15 修飾符,因此轉換說明符為%15lu。

b.十六進位制整型資料的轉換說明符是%x(輸出小寫字母使用小寫 x),輸出 0X 使用# 修飾符;長度為 4 就使用 4 作為修飾符,因此轉換說明符為%#4x;

c.輸出科學計數法使用轉換說明符%E(輸出大寫字母使用大寫 E),左對齊使用‘−’號修 飾符,字元寬度為 12,顯示兩位小數使用 12。2 修飾符,因此轉換說明符為%−12。2E;

d.浮點數轉換說明符是%f,顯示正號使用‘+’修飾符,字元寬度是 10,有 3 位小數,使 用 10。3 修飾符,因此轉換說明符為%+10。3f;

e.字串轉換說明符是%s,欄位寬度為 8,顯示前 8 個字元使用 8。8 修飾符,因此轉換 說明符為%8。8s。

4)列印下面各項內容要分別使用什麼樣的轉換說明符?

a.一個欄位寬度為 6、最少有 4 位數字的十進位制數;

b.一個在引數列表中給定欄位寬度的八進位制整數;c.一個欄位寬度為 2 的字元;

d.一個形如+3。13、欄位寬度等於數字中字元數的浮點數;

e.一個欄位寬度為 7、左對齊的字串中的前 5 個字元。

分析與解答:

a.十進位制整數使用轉換說明符%d,欄位寬度為 6,最少有 4 位數字,使用 6。4 修飾符, 因此轉換說明符為%6。4d;

b.八進位制資料使用轉換說明符%o,欄位寬度由引數列表指定,使用修飾符‘ * ’,因此轉 換說明符為%*o;

c.字元資料使用轉換說明符%c,欄位寬度為 2,使用修飾符 2,因此轉換說明符為%2c;

d.浮點型資料使用轉換說明符%f,顯示正號,欄位寬度為數字中字元數,即不指定字 段寬度,小數點後顯示兩位,使用修飾符+0。2,因此轉換說明符為%+0。2f;

e.字串使用轉換說明符%s,欄位寬度為 7,顯示前 5 個字元,左對齊,使用修飾符−7。5,因此轉換說明符為%−7。5s。

▲ 摘選自

《C Primer Plus(第6版)中文版習題解答》第四章課後訓練題

— 02 —

C語言指路燈

C語言從早期的非正式的K&R標準,發展到1990 ISO/ANSI標準,進而發展到2011 ISO/EC標準。本書也隨著逐漸成熟,發展到現在的第6版。在所有這些版本中,我的目標足致力於編寫一本指導性強、 條理清晰而且有用的C語言教程。

——《C Primer Plus》系列書籍作者 Stephen Prata

很多人會問:C語言這麼好,我也想學好它,但是我該怎麼開始第一步呢?

萬事開頭難,跟著教材開始學就好了。

C語言書這麼多,我該買哪一本呢?

其實,從C語言面世以來,相關書籍數不勝數,但唯獨有一本圖書,跟隨C語言一起成長,暢銷38年,迭代6版,每個版本豆瓣評分9分以上,累計銷售量已超過100萬冊,被C語言程式設計師奉為圭臬!

它就是《C Primer Plus》系列圖書,2016年人民郵電出版社釋出《C Primer Plus 6》中文版,在豆瓣評分上獲得9。3分的高分好評,在之前版本的基礎之上進行了全新升級。從1984年至今,作者初心不變——致力於編寫一本指導性強、條理清晰而且有用的C語言教程。

C Primer Plus 第6版 中文版

繞開C語言4個大坑,這個學習順序要牢記

內容介紹:

幾乎所有C 語言程式設計師都會將《C Primer Plus》作為自己的入門書籍,對於 C 語言初學者來說,它就像引路人一樣意義非凡。

所以,書中大量完整的、可執行的程式及詳細的註釋有助於理解程式碼和概念。

與市面上其他的教程書籍相比,《C Primer Plus(第 6 版)中文版》最大的特點就是讀起來不會有枯澀煩躁之感。

因為斯蒂芬·普拉塔十分在意讀者在閱讀過程中的閱讀體驗,所以書中新出現的每一個術語,符號,都給出貼近讀者目前知識儲備的和理解能力的解釋。

而且,這本書在編排上也十分與眾不同,在每個知識點後面都會附帶一個“程式清單”,也就是程式例項,這是理解程式設計知識點的絕好方法,

供初學者自己手動實操,提升程式設計水平。

C Primer Plus 第6版 中文版習題解答

繞開C語言4個大坑,這個學習順序要牢記

內容介紹:

在千呼萬喚中,《C Primer Plus(第6版)中文版習題解答》面世了,為了每個程式設計師都能將所學的知識落實到實際專案,它是作者根據《C Primer Plus(第 6 版)中文版》而撰寫的,由北京師範大學名師詳細剖析所有題目,

全面提升 C 程式設計能力的優選程式設計練習冊

,也是這個《C Primer Plus》系列經典暢銷圖書不可缺少的學習伴侶。

《C Primer Plus(第6版)中文版習題解答》針對於提高 C 語言的程式設計技能、理解計算機原理的枯澀知識,和《C Primer Plus》系列一樣通俗易懂,作者旨在讓讀者讀得舒服、讀得通透。

在每章內容做了簡單總結和梳理的基礎上,

根據學習的不同階段,對所有複習題和程式設計練習做了詳細的解答,至始至終都有詳盡完整的答案程式碼示例。

◆ 在介紹C語言細節的同時,講解程式設計概念;

◆ 每次儘量用短小簡單的示例演示一兩個概念,學以致用是最有效的學習方式之一;

◆ 當概念用文字較難解釋時,則用圖表演示以幫助讀者理解;

◆ C語言的主要特性總結在方框中,便於查詢和複習;

◆ 每章末尾設有複習題和程式設計練習,幫助讀者測試和加深對C語言的理解。

適宜人群:

作為《C Primer Plus(第6版)中文版》的配套參考書,本書特別適合需要系統學習C語言的初學者閱讀,也適合打算鞏固C語言知識或者希望進一步提高程式設計技術的程式設計師閱讀。

— 03 —

結語

我們要時刻記住:C 語言是一門十分嚴謹的語言,知識體系龐大,需要掌握的知識非常多,單單看書是無法真正掌握這門語言的核心,只有多寫多練習,才能透徹地瞭解 C 語言、懂得 C 語言,將它熟練運用。