一名优秀的C程序员

来源:互联网 发布:早产儿生长曲线图软件 编辑:程序博客网 时间:2024/04/27 05:01

每过一段时间我总会收到一些程序员发来的电子邮件,他们会问我是用什么编程语言来编写自己的游戏的,以及我是如何学习这种编程语言的。因此,我认为在这篇博文里列出一些有关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
unsignedintui_one         = 1;
signedint i_one            = 1;
signedshort 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
externvoid foo(void);
void(*f)();
f = &foo;     // 合法
f = foo;      // 同样合法!(语法糖)
f();         // 调用f
(*f)();      // 同样调用了f(语法糖)

或者有关数组/指针/类型退化的例子:

1
2
3
4
5
6
7
8
9
10
11
intarray[] = {0, 1, 2, 3, 4};
int*pointer = array;
 
if(sizeofarray == sizeofpointer)
    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。当我阅读这些代码时,我会自己撰写备忘日志。之后我会整理这些日志,写成技术文章(Doom、Quake、Wolfenstein 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 / 代码大全 第二版》

 

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 在租房中房东随意调换房间怎么办 梦见熟人当面说我坏话偷东西怎么办 偷了家里的存折拿了钱该怎么办 故意让小偷偷车捉住他怎么办 进屋门正对着厕所门怎么办 楼房对面门上放个镜子我该怎么办 从顺丰发的水果坏了顺丰不管怎么办 汽车塑料件被机头水腐蚀了怎么办 孕期吃了炒菜里面加的香精怎么办 五个月宝宝只长身高不长体重怎么办 孩子6个月奶水越来越少怎么办 孩子快三个月了奶水越来越少怎么办 老婆生完孩子乳房肿胀不下奶怎么办 大人吃了退烧药不出汗怎么办 三岁宝宝抵抗力差总生病怎么办 8个月宝宝发烧39度怎么办 小孩发烧吃了药不退烧怎么办 小孩一直发烧39度左右不退怎么办 九个月宝宝反复发烧39度怎么办 八个月宝宝反复发烧39度怎么办 十个月宝宝反复发烧39度怎么办 2岁宝宝反复发烧怎么办39度左右 宝宝两周岁光吃水果不吃饭怎么办 3岁宝宝光吃水果不吃饭怎么办 中学生就爱玩儿游戏不爱学习怎么办 一岁宝宝只吃水果不吃饭怎么办 孩子发烧咳嗽怎么办最有效的方法 打了百白破孩子一直发烧咳嗽怎么办 顺产侧切肛门坠胀解大便难受怎么办 2岁拉肚子拉水怎么办吃什么药 三岁宝宝三天没拉大便怎么办 3个月宝宝3天没大便怎么办 3个月宝宝4天不拉大便怎么办 17个月宝宝看见生人害怕怎么办 大人给四个月婴儿喂糖水怎么办 宝宝12个月了还一直坐着玩怎么办 七个月宝宝发烧不到38℃怎么办 一个月大的婴儿头立不起来怎么办 18个月的宝宝晚上总找妈妈怎么办 婴儿吃了妈妈生气的奶上火怎么办 3个月的宝宝认人怎么办