成为一名优秀的C程序员

 英文原文:To become a good C
programmer

  问题的提出

  每过一段时间我总会收到一些程序员发来的电子邮件,他们会问我是用什么编程语言来编写自己的游戏的,以及我是如何学习这种编程语言的。因此,我认为在这篇博文里列出一些有关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程序设计语言》("C
Programming Language"
,又称 K&R)。这是你应该首先去看的有关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专家编程》(Expert
C Programming

  这是本神奇的书,因为该书以一种非常娱乐化的方式告诉你在代码背后究竟都发生了些什么。通过介绍了几个著名
bug 的奇闻异事(大部分跟 NASA 有关)后,读者将再次领略整型提升、下标、类型退化以及许多其他的C语言犄角。这本书是如此的迷人,你很可能会一晚上埋头读完
353 页,然后失望地说:怎么这么短?

  现在你想挖的更深些并成为一个优秀的C程序员,你应该拿起这本你所需要的最后一本C语言书籍:

  3.  《C语言参考手册》(C:
A Reference Manual

  这本书全面涵盖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
2nd edition / 代码大全 第二版》

时间: 2024-08-01 21:24:19

成为一名优秀的C程序员的相关文章

你想成为优秀的Java程序员吗?

Java是全世界最受欢迎的3大编程语言之一,它可以开发出许多实用的WEB应用程序和桌面应用程序,更重要的一点,Java是跨平台的语言——编写一次,可以再任何地方运行.另外,Java也很容易入门,如果你想成为一名优秀的Java程序员,那么请你扪心自问一下,你熟悉下面的知识点吗? 面向对象概念 抽象类和接口 构造函数和初始化函数的执行顺序 文件读写和序列化 集合——List.Map.Set 访问控制 异常处理 泛型 Java关键字——Static , Final , volatile, synchr

我不是个优秀合格的程序员

我不是个优秀合格的程序员 每每看到网上大量关于优秀合格程序员的标准,条件,感觉自己压根就称不上是一个合格的程序员,我好像只是把它当做生活下去的一个行当,混饭吃的,王小波说干什么都好,只要干出个样子来!我好像每天没有什么重要的事做,没有激情,好奇心去学习新的语言,在网上这里逛逛,那里逛逛,没有一个整体计划来给自己充电,完全不具备不断钻研,学习新东西程序员该有的资质. 我心里的优秀合格程序员具备以下几个因素: 1.技术 在技术方面,要有不断钻研,在各种开源代码网站游刃有余,总结整理成自己的东西. 2

一个优秀的c++程序员应该具备的素质

1.把C++当成一门新的语言学习(和C没啥关系!真的.): 2.看<Thinking In C++>,不要看<C++变成死相>: 3.看<The C++ Programming Language>和<Inside The C++ Object Model>,不要因为他们很难而我们自己是初学者所以就不看: 4.不要被VC.BCB.BC.MC.TC等词汇所迷惑--他们都是集成开发环境,而我们要学的是一门语言: 5.不要放过任何一个看上去很简单的小编程问题--他们

【转】优秀的Java程序员必须了解GC的工作原理

一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率 ,才能提高整个应用程序的性能.一个优秀的Java程序员必须了解GC的工作原理.如何优化GC的性能.如何与GC进行有限的交互,因为有一些应用程序对性能要求较高,例如嵌入式系统.实时系统等,只有全面提升内存的管理效率 ,才能提高整个应用程序的性能.本篇文章首先简单介绍GC的工作原理之后,然后再对GC的几个关键问题进行深

如何成为一名成功的iOS程序员

编程是一个仅靠兴趣仍不足以抵达成功彼岸的领域.你必须充满激情,并且持之以恒地不断汲取更多有关编程的知识.只是对编程感兴趣还不足以功成名就--众所周知,我们工作起来像疯子. 编程是一个没有极限的职业,所以要成为一个成功的程序员,你必须超越现有已存在的极限.在程序员职业生涯的开始阶段,他们将面临许多挑战,面对困境,他们之中有一些人将会放弃,而只有少数人会坚持到底,并成为这个领域的领头羊. 成为成功程序员的步骤 1.愿意学习新技术 随着技术的不断进步,我们学到和实施的技术会很快地过时.所以,作为一个程

一名 40 岁“老”程序员的反思

英文:Ben Northrop  译文:开源中国 [导读]:Ben Northrop 在 2016 年满了 40 岁,本文是他对职业生涯的思考.他认为从长远来看,应该多投资一些不容易过期.衰竭期较长的知识领域中. 我是一名程序员,几个月前刚过完 40 岁生日.某个星期六的早晨,我参加了一个 React Native 技术交流会,演讲者正在竭力说服我们为什么它会成为移动开发领域真正的下一个大事件.但对我来说,它有点像 15 年前的 JSP,将所有的逻辑都放在演示代码里面.但我"老"了,我

如今仍在工作的12名最“屌”的程序员

版权声明:本文转自创业邦 人们每天使用的App,以及玩儿的电子游戏不是凭空就有的,而是程序员笔耕不辍,靠着他们一行行的代码开发出来的. 当然,那些App应用.网页.甚至是整个互联网本身,都需要依靠平台和硬件来运行.更重要的是,就连人们构建这些平台所需要的编程语言,其实也是需要有人开发出来.那么问题来了,站在编程金字塔顶端的那些人,都是谁呢? 1.Linus Torvalds,他在赫尔辛基大学的宿舍里开发了Linux,一款免费的操作系统.如今,Linux已经成为了全球很多大型数据中心,超级计算机,

如何成为一名真正专业的程序员

要想成为一名专业的程序员,仅仅会写代码是不够的.从团队合作去解决问题到版本控制,你还得具备其他关键技能的工具包.当我们询问相关的专业开发人员,那些必备的关键技能都是什么的时候,下面是我们了解到的情况. 关于如何学习代码,各种声音很多,然后很多人就被误导为成为专业开发人员懂得一门编程语言就够了?!呵呵,就像其他工作一样,光会一个技能那是远远不够的.如果你想要成为一名开发人员,下面就是一些你必须要掌握的最重要的技能(编码这个要求就不赘述了,这太理所当然了). 学会并擅长沟通 虽然一些媒体上面将编程描

一个优秀的.net程序员必须要学会的技能 (转)-----参照学习目标

最近室友闲聊的时候告诉我,他在网上收集了做为一个java程序员必须要会的东西,他觉得自己要有个方向,否则一定会在平平凡凡的工作中,不思进取,最终 浑浑噩噩.真是让我猛然惊醒啊,做为一个底层的程序员,如何才能拼得过出来的大学精英和社会老手?学习一定必不可少.虽然自己有点懒,我先把这些记下,待 日后尽量弄懂. Web/WinForm/通吃,包括ASP.NET,WebService,Remoting,Thread,Serializable,ADO.NET等命名空间 精通UML 精通DesignPatt