如何成为一名优秀的C程序员
問題的提出
每過一段時間我總會收到一些程序員發(fā)來的電子郵件,他們會問我是用什么編程語言來編寫自己的游戲的,以及我是如何學(xué)習(xí)這種編程語言的。因此,我認為在這篇博文里列出一些有關(guān)C語言的最佳讀物應(yīng)該能幫到不少人。如果你知道其它的優(yōu)秀讀物,請給我發(fā)郵件或者直接在評論欄中告訴我吧。
問題的解答(你可以略過這部分)
我在之前的一篇博文中已經(jīng)提到過了,目前為止,所有我所編寫的商業(yè)3D引擎95%都是C89(也稱作標準C,或ANSI C)。我之所以選擇C89而不是C99是因為有些編譯器仍然不能完美支持C99標準。而且從第一天起,我就強制規(guī)定游戲需要能在iOS、Windows和Xbox 360平臺上都能編譯。根據(jù)我所選擇的編譯平臺,剩下5%的代碼是Objective-C(iOS)或者C++(Windows,Mac OS X),這是為了將引擎綁定到原生的輸入/輸出設(shè)備上。沒想到的是,選擇C還是C++這個主題在reddit曾上引發(fā)了很大的爭議。我選擇C的兩個真正原因是:
● 我寫引擎時對C++掌握的并不算好。平臺資源非常有限(iPhone 2G),而且我知道我得對我的工具(編程語言)相當熟悉才能使游戲達到每秒60幀的速度。
●因為我研讀過id Software(著名游戲制作公司,Doom系列、Quake系列是其代表作,開創(chuàng)了FPS類型游戲的先河)發(fā)布過的源代碼,用純C完成一個商業(yè)游戲是我的夢想。
這算是“好”的選擇嗎?我想,到最后唯一合理的問題是:“你的游戲發(fā)布了嗎?”以及“它跑的夠快嗎?”看看那令人難以置信的幀速吧(有人提到在玩Shmup時會有眩暈的感覺),我想我做了正確的選擇。
?
糟糕的C讀物(不要忽略這一段)
我將以一些我認為不必太認真的讀物說起:網(wǎng)絡(luò)教程,博客以及大部分Google上得到的東西都算(沒錯,也包括我這篇)。通常我認為這些資料來源是不可信的,而且有潛在的危害。和這一行里大部分人一樣,我曾是重度Google搜索使用者。過了一段時間之后,我發(fā)現(xiàn)不準確的答案反而對生產(chǎn)力的提高有反效果。這讓我有了一種速度上的錯覺:答案找的越快,活干的越慢。沒有什么網(wǎng)站會比一本好書更有價值,沒有什么好書比反匯編輸出更有價值。
?
優(yōu)秀的C讀物
程序設(shè)計語言
1.《C程序設(shè)計語言》
《C程序設(shè)計語言》,又稱 K&R C。這是你應(yīng)該首先去看的有關(guān)C語言編程的經(jīng)典著作。讀這本書會很輕松,它只有272頁,386幅插圖。由C語言之父Kernighan和Ritchie親自編寫的短小且有清晰解釋的代碼示例遍布全書各個角落。在剛開始的幾周里,所有你需要了解的有關(guān)C語言的知識都在這里。這本書讀起來很有趣,主題都比較短小,而且可以使你很快上手。你可能會跳過附錄A(有關(guān)C語言中比較晦澀的陰暗角落,比如類型提升、 類型轉(zhuǎn)換、型別退化以及其它一些無用的東西)以及有關(guān)C標準庫的附錄B。我認為剛開始學(xué)習(xí)C語言時,這些就足夠了。這本書使C顯得很嬌小、簡潔,因此強烈推薦學(xué)習(xí)這本書。
如果你繼續(xù)學(xué)習(xí)并堅持練習(xí),很快你就會觸到一些詭異的情況,比如下面的例子:
| 1 2 3 4 5 6 7 8 9 10 11 12 | unsigned int ui_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語言里有很多這種陰暗面,此時將產(chǎn)生不正確的結(jié)果。
這里還有許多細節(jié)之處:
| 1 2 3 4 5 6 | extern void foo(void); void (*f)(); f = &foo; // 合法 f = foo; // 同樣合法!(語法糖) f(); // 調(diào)用f (*f)(); // 同樣調(diào)用了f(語法糖) |
或者有關(guān)數(shù)組/指針/類型退化的例子:
| 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!!”); |
當你發(fā)現(xiàn)自己原來對C語言的了解還很不夠時(附錄A真的太輕量級了),那這時就是拿起第二本書的時候了。
2.《C專家編程》
這是本神奇的書,因為該書以一種非常娛樂化的方式告訴你在代碼背后究竟都發(fā)生了些什么。通過介紹了幾個著名bug的奇聞異事(大部分跟NASA有關(guān))后,讀者將再次領(lǐng)略整型提升、下標、類型退化以及許多其他的C語言犄角。這本書是如此的迷人,你很可能會一晚上埋頭讀完353頁,然后失望地說:怎么這么短?
現(xiàn)在你想挖的更深些并成為一個優(yōu)秀的C程序員,你應(yīng)該拿起這本你所需要的最后一本C語言書籍:
3.《C語言參考手冊》
這本書全面涵蓋C/C89/C99標準。從今以后你面對的就是這些冰冷無聊的語言標準。你可以把K&R 和C專家編程放在書架上,而把這本C語言參考手冊擺放在顯示器旁,任何你想知道的C語言知識都在這里。
?
附加閱讀
1.id Software 代碼庫
只看書當然是不夠的。閱讀優(yōu)秀的開源代碼將帶來極大的幫助。我的最愛是id Software的3D引擎代碼庫:Doom、Quake、Quake2、Quake3、Wolfenstein 3D iPhone以及Doom iPhone。當我閱讀這些代碼時,我會自己撰寫備忘日志。之后我會整理這些日志,寫成技術(shù)文章(Doom、 Quake、Wolfenstein 3D iPhone 以及Doom iPhone)。
2. 《Sh*t My Dad Says》
試著保持健康的生活,改變一下,讀些有趣的東西吧 : )
?
注
原文評論欄中推薦的一些補充書目:
1. C Interfaces and Implementations: Techniques for Creating Reusable Software(C語言接口與實現(xiàn):創(chuàng)建可重用軟件的技術(shù))
2.Object-Oriented Programming With ANSI-C
3. 《Code Complete 2nd edition / 代碼大全 第二版》
總結(jié)
以上是生活随笔為你收集整理的如何成为一名优秀的C程序员的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: android开发中的数据库SQLite
- 下一篇: SQLiteOpenHelper使用详解