如何成为一名优秀的C程序员

问题的提出php

每过一段时间我总会收到一些程序员发来的电子邮件,他们会问我是用什么编程语言来编写本身的游戏的,以及我是如何学习这种编程语言的。所以,我认为在这篇博文里列出一些有关C语言的最佳读物应该能帮到很多人。若是你知道其它的优秀读物,请给我发邮件或者直接在评论栏中告诉我吧。html

问题的解答(你能够略过这部分)程序员

我在以前的一篇博文中已经提到过了,目前为止,全部我所编写的商业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时会有眩晕的感受),我想我作了正确的选择。iphone

 

糟糕的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 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语言里有不少这种阴暗面,此时将产生不正确的结果。

这里还有许多细节之处:

 

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、Quake二、Quake三、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 / 代码大全 第二版》

关于译(做)者:
陈舸:程序员,关注网络协议、开源软件、Linux、C/C++、Python。目前从事网络通讯设备的开发。在看过《DOOM启示录》后,真正为书中描述的程序员生活和黑客精神所震动。我没法达到Carmark的水准,但能够有和他同样的分享精神。(新浪微博:@bigsh1p

 

原文:http://www.kuqin.com/language/20120319/319131.html#source

相关文章
相关标签/搜索