问题的提出

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

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

如何成为一名优秀的C程序员相关推荐

  1. 没有学历文凭,如何成为一名优秀的 Java 程序员?

    作为编程语言界的常青藤 Java,无论是在企业级应用,还是后端开发中,均有着无可替代的地位.而对于 Java 的入门,很多新手们不可避免的会走一些弯道.那么,如何才能有效地避开这些误区?又该如何快速实 ...

  2. 程序员用学位证吗_没有学位如何成为一名优秀的Java程序员

    程序员用学位证吗 掌握Java的道路是漫长而棘手的. 但是,在我从事编码工作的那几年中,我获得了一两个提示. 但是,如何成为一名优秀的Java程序员不是一个简单的问题? 您不需要任何正式培训. 您无需 ...

  3. 学习C语言的教材、如何成为一名优秀的C程序员、激发程序员创意的6本书、国外程序员推荐:每个程序员都应读的书

    学习C语言的教材 我的C语言是自学的,这些年看过不少教材. 下面,我对其中一些教材做个点评. 1. How to Think Like a Computer Scientist: C version ...

  4. 没有学历文凭,如何成为一名优秀的 Java 程序员

    "如何成为一名优秀的Java程序员"不是只字片语就能回答清楚的.没有相关的学位证书,你也可以被称为一名优秀的Java程序员. 你只需集中精力,主动利用网上丰富的资源,投入足够的时间 ...

  5. 怎样才能成为一名优秀的高薪程序员?

    作者:findyi 作者简介:前360技术总监,互联网从业11年的非典型码农,也是一名产品人.(来源于作则工作号简介) 微信公众号:findyi 链接:https://www.zhihu.com/qu ...

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

    C++这门语言从诞生到今天已经经历了将近30个年头.不可否认,它的学习难度都比其它 语言较高.而它的学习难度,主要来自于它的复杂性.现在C++的使用范围比以前已经少了很多,java.C#.python ...

  7. [转]想要成为一名优秀的Java程序员,这份文档必读

    A.规则(1–2 级) 1.在switch 中每个 case 语句都应该包含 break 或者 return . 2.不要使用空的for .if .while 语句. 3.在运算中不要减小数据的精度. ...

  8. 一名90后的程序员之路(三) 工程师与码农

    提笔,已经过了三年,实在是隔得太久了.我已经忘记了我的csdn密码,最后还是通过手机找回的. 不过呢,还是那句话,无论隔了多久,我很开心,我又回来了.虽然没几个人看,但我想,我会坚持下去. 书接上文, ...

  9. 优秀的Java程序员应具备哪些编程技术?

    想要成为一名合格的java程序猿,需要学习的知识是有很多的,但是基础知识一定要非常牢固,基础不牢固的程序员,随时都会被新的知识和技术所淘汰,下盘不稳风一吹就倒,那么具体作为一个优秀的Java程序员应具 ...

最新文章

  1. 什么是QoS技术?—Vecloud微云
  2. Hough直线检测的理解
  3. MySQL高级 - like模糊匹配
  4. 米线店结账程序 装饰着模式_实验报告2_装饰者模式
  5. 【HDU - 1839】Delay Constrained Maximum Capacity Path(最短路 + 二分)
  6. Echarts 地理信息可视化:基于地图显示坐标点信息
  7. mysql jooyoo net_.net连接MySQL的方法
  8. Lucene入门程序
  9. 随想录(大学给了我们什么)
  10. 关于C#中Remoting的使用
  11. 讲讲电感器的结构、分类及特性!
  12. CentOS7图形界面和命令行界面的切换快捷键
  13. 趣味js之斗牛算法详解
  14. ruby和php比较,十张图读懂PHP、Python、 Ruby三大语言的差异
  15. 【LeetCode - 159】至多包含两个不同字符的最长子串
  16. MySQL的varchar水真的太深了——InnoDB记录存储结构
  17. linux环境下安装python3以及安装cx_Oracle模块需要注意的事项
  18. SVN+SSH协议工作方式全解析,以Sourceforge为例讲解如何在Windows下配置TortoiseSVN和Su
  19. Elasticsearch:Rank feature query - 排名功能查询
  20. 2020年华东理工大学计算机推免面试

热门文章

  1. SharePoint 2013 Farm 安装指南——Least Privilege
  2. 一步步编写操作系统 59 cpu的IO特权级1
  3. ORA-01114: 将块写入文件 35 时出现 IO 错误
  4. linux下java程序实现重启功能
  5. ocp证书怎么考_没有基础怎么考初级会计证书?
  6. 【Python学习】 - sklearn - 用于生成数据的make_blobs模块
  7. webapi自宿主设置本地端口使用https协议
  8. 数据库工具一段时间后打开报错:远程过程调用失败0x800706be
  9. 计算机二级c语言第82套,计算机等级考试二级C语言模拟试题十套答案
  10. 计算机选购知识点,笔记本选购知识点,找准自己的需求才是王道