问题的提出

每过一段时间我总会收到一些程序员发来的电子邮件,他们会问我是用什么编程语言来编写自己的游戏的,以及我是如何学习这种编程语言的。因此,我认为在这篇文章里列出一些有关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语言的相关知识,包括数据类型、格式化输入输出、运算符、表达式、流程控制语句、函数、数组和指针、字符串操作、内存管理、位操作等等,知识内容都针对C99标准。本书既适合希望系统学习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语言c99标准_如何成为一名优秀的 C 语言程序员?相关推荐

  1. c语言c99标准_从年薪10万到年薪30万,C语言程序员必读的5本书

    C语言是由 Dennis Ritchie在1969年到1973年在贝尔实验室研发的.C语言可以把程序简单地编译为机器指令,使得它成为了最高效的语言. 为什么在程序员中,C语言如此流行呢?这背后有很多原 ...

  2. c语言c99标准_自学C语言之一

    上次自学C语言还是在刚开学到国庆期间,听学姐的建议买了本C语言的书,在军训期间的晚上翻翻看看.后来选课.开始正式上课.面试社团.开各种会等等,好像每天都有许多事要忙,但又没忙出来什么结果,慢慢地好像就 ...

  3. c++ primer plus中文版_如何成为一名厉害的C/C++程序员?

    每一个学技术的人 都想干个三五年就能成为大牛 跳槽去大厂,薪水翻番 或者在一个小公司里,带个小团队 在30岁左右成为项目经理 晋升管理层 买房买车,实现人生理想 然而技术之路漫漫 想要成为牛×的程序员 ...

  4. c语言c99标准_C语言的灵魂指针,配合这个新增的关键字,能够生成更高效的程序...

    正如我前面的文章提到的,C语言虽然已经比较成熟,但是近些年来也是有所发展的--比如增加了许多新特性.遗憾的是,可能因为C语言程序员的工资比不过互联网程序员,国内很多教材比较老旧,几乎不涉及近些年来C语 ...

  5. c语言c99标准_C语言的三套标准:C89、C99和C11

    我们今天使用的 Windows.Linux.Mac OS 等操作系统都是由一种叫做 Unix 的系统演化而来.Unix 作为80年代主流的操作系统,是整个软件工业的基础,是现代操作系统的开山鼻祖,C语 ...

  6. 语言 重量计算_大师之光:有种跨越国界的语言叫C++

    语言太重要了,因为他的重要性,每个人都花很多时间来学习语言,幼儿时先学习母语,略长大了开始学习外语,成年了可能再进一步巩固母语,或者学习更多的外语. 对于越来越多的现代人来说,除了学习人类的语言外,还 ...

  7. c语言有趣代码_【新课预知】——C语言程序设计

    编者按:如今疫情这么严重,为了保护好自己,为了身边的人,大家可一定要听从国家号召--"宅"起来!并且,小编们为了让大家伙"宅"得更加健康,可是费了不少脑筋呢,学 ...

  8. c语言作业参考文献,c语言外文参考文献_数学类的文献 外文翻译_c 语言与面向对象的设计 习题及参考解答...

    第1章 C语言程序设计概述(1) 1.1 程序设计基础知识(2) 1.2 C语言的历史沿革及特点(9) 1.3 C语言源程序的组成.书写规则与风格(11) 1.4 C语言的字符集.标识符与关键字(15 ...

  9. 蜂鸣器发出7种音阶c语言程序_我们做为一名优秀的程序员,是不是应该知道编程语言的发展简史...

    我们都知道,编程语言是一组用来定义计算机程序的语法规则.它是一种被标准化的交流语言,用来向计算机发出指令.一种计算机语言让程序员能够准确地定义计算机所需要使用的数据,并较精确地定义在不同情况下所应当采 ...

最新文章

  1. PostgreSQL 10.1 手册_部分 II. SQL 语言_第 12 章 全文搜索_12.9. GIN 和 GiST 索引类型
  2. raid0、raid1、raid5、raid10 flash
  3. 遥控器按键不灵的修复方法
  4. TestinPro应用与DevOps之路
  5. 关于java设计模式与极品飞车游戏的思考
  6. Webpack实战(九):实现资源按需加载-资源异步加载
  7. 第四单元和课程总结:简单的架构设计意识
  8. linux复制以a开头的文件,linux部分试题
  9. centos mysql无法登录,解决centos下MySQL登录1045问题
  10. 基于.NET实现数据挖掘--聚类分析算法
  11. 微信小程序豆瓣电影项目的改造过程经验分享
  12. 计算机配置动态硬盘,【转】基本磁盘动态磁盘GTP磁盘MBR磁盘RAID阵列磁盘的区别(一)...
  13. linux数据库安装
  14. 蚁群算法原理及c++实现
  15. c语言编程计算缴税,C语言编写一个计算个人所得税的程序,要求输入收入金额,能够输...
  16. PS三分钟扣图教程,并增强画质
  17. Qt之简易版网络调试助手
  18. Creo8.0将默认单位永久设置为公制毫米的方法
  19. 陈学贤华南理工大学计算机专业,张见威 - 华南理工大学 - 计算机科学与工程学院...
  20. foreign key() references 字段名(字段名)详细用法

热门文章

  1. python查看安装包的版本scipy,numpy,matplotlib等
  2. pyqt5实战之自定义弹窗口
  3. 带你一起学kivy第一天
  4. JavaWeb系列之:Servlet
  5. 关于Android 隐藏 API 和内部 API的查看与使用
  6. Generator函数的语法以及异步的应用
  7. 使用masonry布局旋转View的问题
  8. [Unity3d]制作打包并载入AssetBundle
  9. 国内知名 IT 公司前端团队
  10. Git查看、删除、重命名远程分支和tag【转】