程序设计基石与实践系列之成为一名Top的C语言程序员

翻译 2015年10月04日 11:32:06

英文出处:Fabien Sanglard -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程序设计语言》,又称 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;   // Valid 
f = foo;    // Valid too ! (syntactic sugar)
	
f();        // Calls f
(*f)();     // Calls f too ! (syntactic sugar)
或者有关数组/指针/类型退化的例子:

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



关于程序设计基石与实践更多讨论与交流,敬请关注本博客和新浪微博songzi_tea.



《C语言及程序设计》实践参考——学生成绩统计

返回:贺老师课程教学链接【项目1-学生成绩统计】 每位同学的信息学号、姓名、C、高数、英语成绩。定义一个学生成绩的结构体数组,其中的数据成员包括学号(char num[13])、姓名(name)、三...
  • sxhelijian
  • sxhelijian
  • 2015年07月04日 15:11
  • 4991

一排石头的游戏(取石头)C语言实现

问题描述: N块石头排成一行,每块石头有各自固定的位置。 两个玩家依次取石头,每个玩家可以取其中任意一块石头,或者相邻的两块石头,石头在游戏过程中不移位。 最后能将石头一次取光的玩家获胜。 ...
  • Zidane_2014
  • Zidane_2014
  • 2015年05月13日 09:46
  • 1127

程序设计基石与实践系列之能让你成为Top程序员的十个C语言资源

大多数程序员都是从C开始学习编程的,因为C是用来写操作系统、应用程序最常用的语言。C编程笔记 : 这些是华盛顿实验学院C编程入门课的部分笔记。它们是以《c程序设计语言》的补充笔记(从1995年春开始)...
  • utimes
  • utimes
  • 2015年10月05日 09:35
  • 1642

程序设计基石与实践系列之C语言程序员必读的5本书

你正计划着通过看书来学习C语言吗?“书籍是人类最忠诚的朋友“。海明威一定知道书籍对一个人一生的重要性。书籍是知识的丰富来源。你可以从书中学到各种知识。书籍可以毫无歧视地向读者传达作者的本意。C语言是由...
  • utimes
  • utimes
  • 2015年10月04日 11:34
  • 3038

程序设计基石与实践系列之C语言函数指针基础

英文出处:Dennis Kubes:Basics of Function Pointers in C本文写的非常详细,因为我想为初学者建立一个意识模型,来帮助他们理解函数指针的语法和基础。如果你不讨厌...
  • utimes
  • utimes
  • 2015年12月18日 23:01
  • 2034

程序设计基石与实践系列之从开源项目学习C语言基本的编码规则

英文出处:CoderGears Team :Learn basic “C” coding rules from open source projects每个项目都有自己的风格指南:一组有关怎样为那个项...
  • utimes
  • utimes
  • 2015年11月30日 17:08
  • 1258

程序设计基石与实践系列之写一个C语言编译器

英文出处:Wilfred Hughes:Baby Steps to a C Compiler动手编写一个编译器,学习一下较为底层的编程方式,是一种学习计算机到底是如何工作的非常有效方法。编译器通常被看...
  • utimes
  • utimes
  • 2015年10月20日 15:19
  • 1788

程序设计基石与实践系列之失落的C语言结构体封装艺术

英文来源于 Eric S. Raymond-- The Lost Art of C Structure Packing谁该阅读这篇文章本文是关于削减C语言程序内存占用空间的一项技术——为了减小内存大小...
  • utimes
  • utimes
  • 2015年11月03日 13:28
  • 1765

程序设计基石与实践系列之C语言未定义行为一览

英文出处:Christopher Cole: a glimpse of undefined behavior in c几周前,我的一位同事带着一个编程问题来到我桌前。最近我们一直在互相考问C语言的知识...
  • utimes
  • utimes
  • 2015年10月13日 09:12
  • 1231

程序设计基石与实践系列之最短的崩溃C语言程序

想写个崩溃的C语言小程序,看起来是个奇怪的主意,不过在我曾经教过的一门实验课上,这是作业之一!实际上,这是一件非常有教学意义的事情。通常学生们要么尝试反向引用一个非法地址,要么就是除0.除0会引发SI...
  • utimes
  • utimes
  • 2015年10月03日 17:15
  • 1763
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:程序设计基石与实践系列之成为一名Top的C语言程序员
举报原因:
原因补充:

(最多只允许输入30个字)