问题的提出
每过一段时间我总会收到一些程序员发来的电子邮件, 他们会问我是用什么编程语言来编写自己的游戏的, 以及我是如何学习这种编程语言的. 因此, 我认为在这篇文章里列出一些有关 C 语言的最佳读物应该能帮到不少人. 如果你知道其它的优秀读物, 请给我发邮件或者直接在评论栏中告诉我吧.
糟糕的 C 读物(不要忽略这一段)
和这一行里大部分人一样, 我曾是重度 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 语言知识都在这里.
4.《C primer plus》
本书全面讲述了 C 语言编程的相关概念和知识. 全书共 17 章. 第 1,2 章学习 C 语言编程所需的预备知识. 第 3 到 15 章介绍了 C 语言的相关知识, 包括数据类型, 格式化输入输出, 运算符, 表达式, 流程控制语句, 函数, 数组 https://baike.baidu.com/item/数组 和指针, 字符串操作, 内存管理, 位操作等等, 知识内容都针对 C99 标准. 本书既适合希望系统学习 C 语言的读者, 也适用于精通其他编程语言并希望进一步掌握和巩固 C 编程技术的程序员.
附加阅读
1.id Software 代码库 ftp://ftp.idsoftware.com/idstuff/
只看书当然是不够的. 阅读优秀的开源代码将带来极大的帮助. 我的最爱是 id Software 的 3D 引擎代码库: Doom,Quake,Quake2,Quake3,Wolfenstein 3D iPhone 以及 Doom iPhone. 当我阅读这些代码时, 我会自己撰写备忘日志. 之后我会整理这些日志, 写成技术文章(Doom, Quake,Wolfenstein 3D iPhone http://www.fabiensanglard.net/wolf3d/index.php 以及 Doom iPhone http://www.fabiensanglard.net/doomIphone/index.php ).
2. 《Sh*t My Dad Says》
试着保持健康的生活, 改变一下, 读些有趣的东西吧 : )
注
原文评论栏中推荐的一些补充书目:
1. C Interfaces and Implementations: Techniques for Creating Reusable Software(C 语言接口与实现: 创建可重用软件的技术)
2.Object-Oriented Programming With ANSI-C http://www.planetpdf.com/codecuts/pdfs/ooc.pdf
3. 《 Code Complete 2nd edition / 代码大全 第二版》
有想要一起学习 C 语言 c++ 的小伙伴可以加我签名的群一起来学习哦!
来源: http://www.jianshu.com/p/109267520aa5