`
473687880
  • 浏览: 535435 次
文章分类
社区版块
存档分类
最新评论

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

 
阅读更多

问题的提出

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

unsignedintui_one = 1;

signedinti_one = 1;

signedshorts_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

externvoidfoo(void);

void(*f)();

f = &foo;// 合法

f = foo;// 同样合法!(语法糖)

f();// 调用f

(*f)();// 同样调用了f(语法糖)

或者有关数组/指针/类型退化的例子:

1

2

3

4

5

6

7

8

9

10

11

intarray[] = {0, 1, 2, 3, 4};

int*pointer = array;

if(sizeofarray ==sizeofpointer)

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

分享到:
评论

相关推荐

    优秀C语言程序员开发之路-经验

    综上所述,成为一名优秀的C语言程序员不仅需要掌握语言的基本语法,还需要深入了解预编译处理命令的使用、时间日期的处理、可变参数的机制、局部与全局变量的作用域管理、时间显示的实现、递归的应用以及变长数组的...

    c程序员成长计划(转)

    从给定的文件信息中,我们可以提炼出一系列与C程序员成长相关的知识点,这些知识点对于初学者尤其具有指导意义。...希望这份成长计划能为每一位致力于成为优秀C程序员的朋友提供有益的指导和启示。

    C语言深度剖析 程序员面试笔试

    深入理解C语言是成为一名优秀的程序员的关键步骤,尤其在面试和笔试环节,对C语言的掌握程度往往是评估候选人技能的重要指标。 本资料旨在对C语言进行深入浅出的讲解,帮助读者不仅理解语言的基本概念,还能够深入...

    优秀程序员之路 C# 开发经验及技巧大汇总.rar

    首先,成为一名优秀的C#程序员,你需要掌握基本语法和数据类型。C#支持多种数据类型,包括整型、浮点型、字符型以及布尔型。理解变量的声明、初始化和作用域是至关重要的。同时,掌握控制流语句,如if条件语句、for...

    C语言笔试题程序员面试题大集合

    通过深入学习并不断练习这些题目,不仅可以提升C语言的技术水平,还能培养良好的编程思维和问题解决能力,这对于成为一名优秀的程序员至关重要。因此,这份“C语言笔试题程序员面试题大集合”无疑是求职者准备面试的...

    经验分享:如何成为一名优秀的高级C++程序员?

    为了成为一名高级C++程序员,首先应当从语言本身入手。推荐《C++ Primer》作为学习的教材,这本书内容丰富且深入,能够帮助学习者打好基础。除了语言基础,还需要掌握一些图形用户界面(GUI)库的知识。C++有多种GUI...

    作为一个程序员的最基本要求

    成为一个优秀的程序员并非易事,它需要的不仅仅是一两门编程课程的学习。...总之,成为一名优秀的程序员是一个长期的过程,需要不断地学习、实践和反思。只有这样,才能在这个充满挑战和机遇的行业中立足并不断进步。

    一个程序员的奋斗经历

    这篇奋斗经历不仅记录了一个非名牌大学毕业生如何通过自己的努力成长为一名优秀的程序员的故事,更重要的是,它传达了一个重要的信息:无论起点高低,只要有坚定的决心和不懈的努力,每个人都有可能实现自己的目标。...

    成为一个好的程序员需要的书.txt

    本文将根据给定的文件信息,详细解析成为一名优秀程序员所必需的书籍和资源。 #### 编程书籍 1. **《C Primer Plus》** - **简介**:这本书是学习C语言的经典之作,它不仅介绍了C语言的基础语法,还深入讲解了...

    作一个真正合格的程序员要知道的

    面对复杂多变的技术挑战时,拥有强大的问题解决能力是一名优秀程序员不可或缺的素质之一。这不仅涉及到如何快速定位问题所在,还包括如何有效地分析问题原因以及提出合理的解决方案。良好的逻辑思维能力和创新能力是...

    C程序员应聘常见面试题深入剖析

    《C程序员应聘常见面试题深入剖析》 C/C++编程语言是软件开发领域的基石,尤其在系统级编程、嵌入式开发以及高性能计算等领域有着广泛...总的来说,扎实的C语言基础和灵活的思维能力是成为一名优秀C程序员的必备条件。

    如何成为一个优秀的JSP 程序员下载

    为了成为一名优秀的JSP程序员,你需要寻找优质的教程和实践项目,如官方文档、在线课程(如Coursera、Udemy)、技术博客和Stack Overflow上的问答。同时,参与开源项目,阅读他人的代码,实践是最好的老师。 **开发...

    如何成为优秀的JSP 程序员

    要成为一名优秀的JSP程序员,你需要深入理解以下几个核心领域: 1. **Java基础知识**:JSP的基础是Java,因此你需要扎实的Java编程基础,包括语法、面向对象编程、异常处理、集合框架、多线程和I/O流等。 2. **...

    C/C++程序员面试宝典

    一名优秀的C/C++程序员无疑是众多企业所渴求的。本书写作的目的就是为C/C++程序员的求职提供一些参考,让他们能够正确地面对自己的求职过程,在面试的过程中能展现出自己最好的一面,提高面试成功的几率。本书将从...

    编程 新手必看书籍 怎样成为一名程序员

    这种解决问题的能力是成为一名优秀程序员不可或缺的素质。 ### 推荐学习资源 - **在线课程**:如Coursera、edX上的计算机科学和编程课程,提供系统性的学习路径。 - **编程社区**:如Stack Overflow、GitHub,可...

    -一个程序员走过的路

    51CTO提供的资源包,名为“一个程序员走过的路”,无疑是一套全面的程序员成长指南。这套资源包可能包含了从基础知识到高级技巧的全方位内容,从C语言和C++的语法教程,到文件操作的实例分析,再到算法设计与实现的...

    如何成为一个优秀的JSP 程序员

    要成为一名优秀的JSP程序员,需要掌握一系列技能和知识,这将涉及到编程基础、Web开发框架、数据库交互以及最佳实践等多个方面。下面,我们将详细探讨如何通过学习和实践来提升自己的JSP开发能力。 1. **Java基础...

    程序员之我的奋斗 程序员之我的奋斗

    然而,成为一名优秀的程序员并非易事,它需要持续的学习、不懈的探索以及面对困难时的坚韧不拔。《程序员之我的奋斗》这篇文章,正是讲述了这样一名程序员的奋斗历程,从中我们可以提炼出多个关键知识点,以启示那些...

    C语言深度剖析 程序员面试笔试必备

    ### C语言深度剖析——程序员面试笔试必备知识点 #### 一、引言 随着信息技术的快速发展,C语言作为一门历史悠久且应用广泛的编程语言,在现代软件开发领域依然占据着重要的地位。然而,很多程序员对于C语言的理解...

    如何成为1名大厂程序员

    一名优秀的程序员不仅需要掌握扎实的技术知识,还需要善于利用各种工具提高工作效率。对于不同的编程语言,推荐使用以下编辑器: - **Java**:推荐使用IntelliJ IDEA或Eclipse。 - **Go**:推荐使用GoLand。 - **...

Global site tag (gtag.js) - Google Analytics