英文原文:
問題的提出
每過一段時間我總會收到一些程式員發來的電子郵件,他們會問我是用什麼程式設計語言來編寫自己的遊戲的,以及我是如何學習這種程式設計語言的。是以,我認為在這篇博文裡列出一些有關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++
這個主題在 曾上引發了很大的争議。我選擇C的兩個真正原因是:
● 我寫引擎時對 C++ 掌握的并不算好。平台資源非常有限(iPhone
2G),而且我知道我得對我的工具(程式設計語言)相當熟悉才能使遊戲達到每秒 60 幀的速度。
● 因為我研讀過 id Software(著名遊戲制作公司,Doom
系列、Quake 系列是其代表作,開創了 FPS 類型遊戲的先河)釋出過的源代碼,用純C完成一個商業遊戲是我的夢想。
這算是“好”的選擇嗎?我想,到最後唯一合理的問題是:“你的遊戲釋出了嗎?”以及“它跑的夠快嗎?”看看那令人難以置信的幀速吧(有人提到在玩 時會有眩暈的感覺),我想我做了正确的選擇。
糟糕的C讀物(不要忽略這一段)
我将以一些我認為不必太認真的讀物說起:網絡教程,部落格以及大部分 Google
上得到的東西都算(沒錯,也包括我這篇)。通常我認為這些資料來源是不可信的,而且有潛在的危害。和這一行裡大部分人一樣,我曾是重度 Google
搜尋使用者。過了一段時間之後,我發現不準确的答案反而對生産力的提高有反效果。這讓我有了一種速度上的錯覺:答案找的越快,活幹的越慢。沒有什麼網站會比一本好書更有價值,沒有什麼好書比反彙編輸出更有價值。
優秀的C讀物
1. 《C程式設計語言》
《C程式設計語言》(,又稱 K&R)。這是你應該首先去看的有關C語言程式設計的經典著作。讀這本書會很輕松,它隻有 272
頁,386幅插圖。由C語言之父 Kernighan 和 Ritchie
親自編寫的短小且有清晰解釋的代碼示例遍布全書各個角落。在剛開始的幾周裡,所有你需要了解的有關C語言的知識都在這裡。這本書讀起來很有趣,主題都比較短小,而且可以使你很快上手。你可能會跳過附錄A(有關C語言中比較晦澀的陰暗角落,比如類型提升、
類型轉換、型别退化以及其它一些無用的東西)以及有關C标準庫的附錄B。我認為剛開始學習C語言時,這些就足夠了。這本書使C顯得很嬌小、簡潔,是以強烈推薦學習這本書。
如果你繼續學習并堅持練習,很快你就會觸到一些詭異的情況,比如下面的例子:
在上面的代碼示例中,由于整型提升的緣故,-1先被計算為大于1,然後又小于1。C語言裡有很多這種陰暗面,此時将産生不正确的結果。
這裡還有許多細節之處:
或者有關數組/指針/類型退化的例子:
當你發現自己原來對C語言的了解還很不夠時(附錄A真的太輕量級了),那這時就是拿起第二本書的時候了。
2. 《C專家程式設計》()
這是本神奇的書,因為該書以一種非常娛樂化的方式告訴你在代碼背後究竟都發生了些什麼。通過介紹了幾個著名
bug 的奇聞異事(大部分跟 NASA 有關)後,讀者将再次領略整型提升、下标、類型退化以及許多其他的C語言犄角。這本書是如此的迷人,你很可能會一晚上埋頭讀完
353 頁,然後失望地說:怎麼這麼短?
現在你想挖的更深些并成為一個優秀的C程式員,你應該拿起這本你所需要的最後一本C語言書籍:
3. 《C語言參考手冊》()
這本書全面涵蓋C/C89/C99标準。從今以後你面對的就是這些冰冷無聊的語言标準。你可以把《K&R》和《C專家程式設計》放在書架上,而把這本C語言參考手冊擺放在顯示器旁,任何你想知道的C語言知識都在這裡。
附加閱讀
1.
隻看書當然是不夠的。閱讀優秀的開源代碼将帶來極大的幫助。我的最愛是 id
Software 的 3D 引擎代碼庫:Doom、Quake、Quake2、Quake3、Wolfenstein 3D iPhone 以及 Doom
iPhone。當我閱讀這些代碼時,我會自己撰寫備忘日志。之後我會整理這些日志,寫成技術文章(、、 以及 )。
2. 《》
試着保持健康的生活,改變一下,讀些有趣的東西吧 : )
注
原文評論欄中推薦的一些補充書目:
1. C Interfaces and Implementations:
Techniques for Creating Reusable Software(C語言接口與實作:建立可重用軟體的技術)
2.
3. 《 Code Complete
2nd edition / 代碼大全 第二版》