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

标签: Uncategorized | 发表时间:2012-03-19 08:34 | 作者:flychen
出处:http://flychen.com

问题的提出

每过一段时间我总会收到一些 程序员发来的电子邮件,他们会问我是用什么 编程语言来编写自己的游戏的,以及我是如何学习这种编程语言的。因此,我认为在这篇博文里列出一些有关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显得很娇小、简洁,因此强烈推荐学习这本书。

如果你继续学习并坚持练习,很快你就会触到一些诡异的情况,比如下面的例子:

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

这里还有许多细节之处:

extern void foo(void);
void (*f)();
f = &foo;     // 合法
f = foo;      // 同样合法!(语法糖)
f();          // 调用f
(*f)();       // 同样调用了f(语法糖)

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

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 2 nd edition / 代码大全 第二版》

 

 

英文原文: Fabien Sanglard      编译: 伯乐在线 —  陈舸

【如需转载,请标注并保留原文链接、译文链接和译者等信息,谢谢合作!】

 

相关文章

from 博客 – 伯乐在线 http://blog.jobbole.com/15384/?utm_source=rss&utm_medium=rss&utm_campaign=%25e5%25a6%2582%25e4%25bd%2595%25e6%2588%2590%25e4%25b8%25ba%25e4%25b8%2580%25e5%2590%258d%25e4%25bc%2598%25e7%25a7%2580%25e7%259a%2584c%25e7%25a8%258b%25e5%25ba%258f%25e5%2591%2598


您可能也喜欢:

程序模拟腾讯微博登录

用GDB调试程序

在Emacs中使用gdb调试程序

腾达TENDA837R/308R无线WAN、WISP万能中继设置教程
来自无觅网络的相关文章:

会写程序的老婆伤不起啊 (@jiankexing)

优秀摄影作品欣赏 (@ycy8)

校园歌手大赛投票程序asp版 (@chaochaoblog)

Web应用程序开发过程简介 (@ineeke)
无觅

相关 [程序员] 推荐:

普通程序员、文艺程序员、2B程序员

- 可可 - 宇宙的心弦
希望能引起广大苦逼的正在学或者已经学过c++人的共鸣和会心一笑吧. 如何辨别自己在现实还是虚拟世界.

如何面试程序员?

- bluesnail - 阮一峰的网络日志
你要面试一个程序员,应该问他什么问题. 有人在Hacker News的讨论区里,请求指点,怎么才能在面试中发现合格的人. 众人纷纷出主意,有很多高质量的回帖,我觉得挺有启发,就整理出了下面这篇文章. 首先,最重要的是,你自己一开始就应该想清楚:. 哪些途径和方法可以发现这样的人. 只有明确这些根本性的问题,才能正确高效地完成面试.

程序员的本质

- Allen - 译言-电脑/网络/数码科技
来源What do programmers really do?.   很多人(包括我岳母)认为计算机变得如此智能,所以在不久的未来将不再需要程序员. 另外一些人认为程序员是天才,他们在电脑前能不断地解决复杂的数学难题. 甚至不少程序员对他们是做什么的都没有清晰的概念.   在这篇文章中,我想给不知情的人解释一下程序员到底是做什么的:.

程序员人生之路

- myartings - 博客园-首页原创精华区
   程序员人生之路(强烈推荐,分析的透彻. ),某程序达人的人生感悟,估计没有半个甲子的时间,是绝对不可能感悟出来的.    相对同时刚出校门同学从事其它行业而言优厚的薪水,以及不断学习更新的专业知识不仅仅让你感到生活的充实,更满足了你那不让外人知的虚荣心. 在刚出校门的几年中,你经常回头看看被你落在后面的同学们,在内心怜悯他们的同时,你也会对自已天天加班的努力工作感到心里平衡:“有付出才会有回报”这句话在那几年中你说的最多,不管是对自已的朋友们还是自已的爱人.

程序员装B指南

- Qing-Run - 博客园-首页原创精华区
1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好. 一个用来查资料,一个用来写代码. 总之要显得信息量很大,效率很高. 2.椅子不一定要舒服,但是一定要可以半躺着. 3.大量的便签,各种的颜色的,用来记录每天要完成的事务,多多益善. 沿着电脑屏幕的边框,尽量贴满,显出有很多事情的样子.

程序员收入报告

- diaoxsh - cnBeta.COM
最近,波兰的程序员Chris(也叫KreCi)公布了他的第十四期程序员收入报告. 数据显示,上月是目前为止他收入最多的一个月. Chris的收入并不是指他的工资或薪水,Chris是一个自由职业者. 他的收入也不是来自个人承包软件工程的收入,他更像是一个果农,种了优良的果树,只要不断的给这些果树施肥浇水,这些果树会给他带来源源不断的财富.

程序员的利器-SourceInsight

- Alex - 博客园-首页原创精华区
作为程序员,大部分时间是在已有的代码上代码工作. 要对已有的代码进行调整,首先就要搞清楚当前代码中蕴含的逻辑关系. 所以常常有程序员调侃说花了大半天时间看代码,最后写代码的时间只有几分钟. 所以,对已有代码的分析质量将影响(甚至会决定)最终代码修改的质量. SourceInsight在代码分析上给予程序员极大的帮助.

程序员?还是小丑?

- Vingel - cnBeta.COM
和你从不认识的人坐在一起,试图弄清楚他是个程序员还是个小丑. 我没有想侮辱任何人的意思,而且,我是第一个要感谢这么多年的教育和努力终于把我变成一个专业小丑的人. 对于程序员新手,我充满怜悯,为了和缓的帮他热热身,我给了他一道温和的问题来消解我们之间的陌生. 我让Ada写一段程序,在纸上,打印出“hello“这个词10次.

程序员必读经典

- - 搜索引擎技术博客
你面试微软前必须要读的十本书:. Code: The Hidden Language of Computer Hardware and Software (《编码的奥秘》). Computer System: A Programmer’s Perspective (《深入理解计算机系统》) /Windows via C/C++ (《Windows核心编程》 / 《程序员的自我修养》.