如何成爲一名優秀的C程序員

From:http://www.2cto.com/kf/201203/123964.html

導讀:作者的幾個觀點:

  1. 網絡教程,博客以及大部分Google上得到的東西都算糟糕的,答案找的越快,活幹的越慢。沒有什麼網站會比一本好書更有價值,沒有什麼好書比反彙編輸出更有價值【這一點可以上升到哲學的高度】
  2. 閱讀優秀的C讀物:《C程序設計語言》、《C專家編程》、《C語言參考手冊》【另外評論中補充的讀物有《C Interfaces and Implementations: Techniques for Creating Reusable Software》、《Object-Oriented Programming With ANSI-C、《Code Complete 2nd edition》
  3. 閱讀優秀的源代碼【id Software 代碼庫
  4. 讀寫有趣的書【《Sh*t My Dad Says》】

原文

問題的提出

每過一段時間我總會收到一些程序員發來的電子郵件,他們會問我是用什麼編程語言來編寫自己的遊戲的,以及我是如何學習這種編程語言的。因此,我認爲在這篇博文裏列出一些有關C語言的最佳讀物應該能幫到不少人。如果你知道其它的優秀讀物,請給我發郵件或者直接在評論欄中告訴我吧。

問題的解答(你可以略過這部分)

我在之前的一篇博文中已經提到過了,目前爲止,所有我所編寫的商業3D引擎95%都是C89(也稱作標準C,或ANSI C)。我之所以選擇C89而不是C99是因爲有些編譯器仍然不能完美支持C99標準。而且從第一天起,我就強制規定遊戲需要能在iOS、Windows和Xbox 360平臺上都能編譯。根據我所選擇的編譯平臺,剩下5%的代碼是Objective-C(iOS)或者C++(Windows,Mac OS X),這是爲了將引擎綁定到原生的輸入/輸出設備上。沒想到的是,選擇C還是C++這個主題在reddit曾上引發了很大的爭議。我選擇C的兩個真正原因是:

● 我寫引擎時對C++掌握的並不算好。平臺資源非常有限(iPhone 2G),而且我知道我得對我的工具(編程語言)相當熟悉才能使遊戲達到每秒60幀的速度。

● 因爲我研讀過id Software(著名遊戲製作公司,Doom系列、Quake系列是其代表作,開創了FPS類型遊戲的先河)發佈過的源代碼,用純C完成一個商業遊戲是我的夢想。

這算是“好”的選擇嗎?我想,到最後唯一合理的問題是:“你的遊戲發佈了嗎?”以及“它跑的夠快嗎?”看看那令人難以置信的幀速吧(有人提到在玩Shmup時會有眩暈的感覺),我想我做了正確的選擇。

 

糟糕的C讀物(不要忽略這一段)

我將以一些我認爲不必太認真的讀物說起:網絡教程,博客以及大部分Google上得到的東西都算(沒錯,也包括我這篇)。通常我認爲這些資料來源是不可信的,而且有潛在的危害。和這一行裏大部分人一樣,我曾是重度Google搜索使用者。過了一段時間之後,我發現不準確的答案反而對生產力的提高有反效果。這讓我有了一種速度上的錯覺:答案找的越快,活幹的越慢。沒有什麼網站會比一本好書更有價值,沒有什麼好書比反彙編輸出更有價值。

 

優秀的C讀物

1.《C程序設計語言》

\

《C程序設計語言》,又稱 K&R C。這是你應該首先去看的有關C語言編程的經典著作。讀這本書會很輕鬆,它只有272頁,386幅插圖。由C語言之父Kernighan和Ritchie親自編寫的短小且有清晰解釋的代碼示例遍佈全書各個角落。在剛開始的幾周裏,所有你需要了解的有關C語言的知識都在這裏。這本書讀起來很有趣,主題都比較短小,而且可以使你很快上手。你可能會跳過附錄A(有關C語言中比較晦澀的陰暗角落,比如類型提升、 類型轉換、型別退化以及其它一些無用的東西)以及有關C標準庫的附錄B。我認爲剛開始學習C語言時,這些就足夠了。這本書使C顯得很嬌小、簡潔,因此強烈推薦學習這本書。

如果你繼續學習並堅持練習,很快你就會觸到一些詭異的情況,比如下面的例子:

1
2
3
4
5
6
7
8
9
10
11
12
unsigned intui_one = 1;
signed int i_one = 1;
signed short s_minus_one = -1;
if (s_minus_one > ui_one)
printf(“-1 > 1 \n”);
if (s_minus_one < i_one)
printf(“-1 < 1 \n”);
 
#./run
#
# -1 > 1
# -1 < 1

在上面的代碼示例中,由於整型提升的緣故,-1先被計算爲大於1,然後又小於1。C語言裏有很多這種陰暗面,此時將產生不正確的結果。

這裏還有許多細節之處:

1
2
3
4
5
6
extern void foo(void);
void (*f)();
f = &foo; // 合法
f = foo; // 同樣合法!(語法糖)
f(); // 調用f
(*f)(); // 同樣調用了f(語法糖)

或者有關數組/指針/類型退化的例子:

1
2
3
4
5
6
7
8
9
10
11
int array[] = {0, 1, 2, 3, 4};
int *pointer = array;
 
if (sizeof array ==sizeof pointer)
printf(“This will never be printed!!”);
 
if (sizeof(int*) == sizeof &array[0])
printf(“This will be printed!!\n”);
 
if (&array[2] - &array[0] == 8 )
printf(“This will never be printed either, result is 2 not 8!!”);

當你發現自己原來對C語言的瞭解還很不夠時(附錄A真的太輕量級了),那這時就是拿起第二本書的時候了。

2. 《C專家編程

\

這是本神奇的書,因爲該書以一種非常娛樂化的方式告訴你在代碼背後究竟都發生了些什麼。通過介紹了幾個著名bug的奇聞異事(大部分跟NASA有關)後,讀者將再次領略整型提升、下標、類型退化以及許多其他的C語言犄角。這本書是如此的迷人,你很可能會一晚上埋頭讀完353頁,然後失望地說:怎麼這麼短?

現在你想挖的更深些併成爲一個優秀的C程序員,你應該拿起這本你所需要的最後一本C語言書籍:

3. 《C語言參考手冊

 

 

\

這本書全面涵蓋C/C89/C99標準。從今以後你面對的就是這些冰冷無聊的語言標準。你可以把K&R 和C專家編程放在書架上,而把這本C語言參考手冊擺放在顯示器旁,任何你想知道的C語言知識都在這裏。

 

附加閱讀

1. id Software 代碼庫

 

\

只看書當然是不夠的。閱讀優秀的開源代碼將帶來極大的幫助。我的最愛是id Software的3D引擎代碼庫:Doom、Quake、Quake2、Quake3、Wolfenstein 3D iPhone以及Doom iPhone。當我閱讀這些代碼時,我會自己撰寫備忘日誌。之後我會整理這些日誌,寫成技術文章(DoomQuakeWolfenstein 3D iPhone 以及Doom iPhone)。

2. 《Sh*t My Dad Says

 

\

試着保持健康的生活,改變一下,讀些有趣的東西吧 : )

 

原文評論欄中推薦的一些補充書目:

1. C Interfaces and Implementations: Techniques for Creating Reusable Software(C語言接口與實現:創建可重用軟件的技術

 

\

2. Object-Oriented Programming With ANSI-C

 

\

3. 《 Code Complete 2nd edition / 代碼大全 第二版》

 

\

 

英文原文:Fabien Sanglard 編譯:伯樂在線 — 陳舸


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章