学习C语言,有哪些值得推荐的经典书籍?
C Primer Plus(第6版)中文版
本书详细讲解了C语言的基本概念和编程技巧。
全书共17章。第1章、第2章介绍了C语言编程的预备知识。第3章~第15章详细讲解了C语言的相关知识,包括数据类型、格式化输入/输出、运算符、表达式、语句、循环、字符输入和输出、函数、数组和指针、字符和字符串函数、内存管理、文件输入输出、结构、位操作等。第16章、第17章介绍C预处理器、C库和高级数据表示。本书以完整的程序为例,讲解C语言的知识要点和注意事项。每章末尾设计了大量复习题和编程练习,帮助读者巩固所学知识和提高实际编程能力。附录给出了各章复习题的参考答案和丰富的参考资料。
本书可作为C语言的教材,适用于需要系统学习C语言的初学者,也适用于巩固C语言知识或希望进一步提高编程技术的程序员。
C和指针
市面上已经有了许多优秀的讲述C语言的书籍,为什么我们还需要这一本呢?我在大学里教授C语言编程已有10个年头,但至今尚未发现一本书是按照我所喜欢的方式来讲述指针的。许多书籍用一章的篇幅专门讲述指针,而且往往出现在全书的后半部分。但是,仅仅描述指针的语法、并用一些简单的例子展示其用法是远远不够的。我在授课时,很早便开始讲授指针,而且在以后的授课过程中也经常讨论指针。我描述它们在各种不同的上下文环境中的有效用法,展示使用指针的编程惯用法(programming idiom)。我还讨论了一些相关的课题如编程效率和程序可维护性之间的权衡。指针是本书的线索所在,融会贯通于全书之中。
指针为什么如此重要?我的信念是:正是指针使C威力无穷。有些任务用其他语言也可以实现,但C能够更有效地实现;有些任务无法用其他语言实现,如直接访问硬件,但C却可以。要想成为一名优秀的C程序员,对指针有一个深入而完整的理解是先决条件。
本书并不是一本关于编程的入门图书。它所面向的读者应该已经具备了一些编程经验,或者是一些想学习C,但又不想被诸如为什么循环很重要以及何时需要使用if语句等肤浅问题耽误进程的人。
另一方面,我并不要求本书的读者以前学习过C。我讲述了C语言所有方面的内容。这种内容的广泛覆盖性使本书不仅适用于学生,也适用于专业人员。也就是说,适用于首次学习C的读者和那些经验更丰富的希望进一步提高语言使用技巧的用户。
优秀的C++书籍把精力集中于与面向对象模型有关的课题上(如类的设计)而不是专注于基本的C技巧,这样做是对的。但C++是建立在C的基础之上的,C的基本技巧依然非常重要,特别是那些能够实现可复用类的技巧。诚然,C++程序员在阅读本书时可以跳过一些他们所熟悉的内容,但他们会在本书中找到许多有用的C工具和技巧。
C代码。C代码运行。运行码运行…请!
——Barbara Ling
所有的C程序都做同一件事,观察一个字符,然后啥也不干。
——Peter Weinberge
C语言编程是一项技艺,需要多年历练才能达到较为完善的境界。一个头脑敏捷的人很快就能学会C语言中基础的东西。但要品味出C语言的细微之处,并通过大量编写各种不同程序成为C语言专家,则耗时甚巨。打个比方说,这是在巴黎点一杯咖啡与在地铁里告诉土生土长的巴黎人该在哪里下车之间的差别。本书是一本关于ANSI C编程语言的高级读本。它适用于已经编写过C程序的人,以及那些想迅速获取一些专家观点和技巧的人。
编程专家在多年的实践中建立了自己的技术工具箱,里面是形形的习惯用法、代码片段和灵活掌握的技巧。他们站在其他更有经验的同事的肩膀上,或是直接领悟他们的代码,或是在维护其他人的代码时聆听他们的教诲,随着时间的推移,逐步形成了这些东西。另外一种成为C编程高手的途径是自省,在认识错误的过程中进步。
本书力图通过揭示一般程序员,甚至是经验老道的职业程序员,如何在编程中犯错误、摔跟头,以提倡和鼓励预防性的程序设计。这些错误实际上一旦被程序员真正认识和理解,并不难避免。因此,本书阐述的重点不是一般原则,而是一个个具体的例子。
如果你是一个程序员并且开发中真正用到C语言来解决复杂问题,这本书应该成为你的案头必备书籍。即使你已经是一个C语言的专家级程序员,仍然有必要拥有这本书,很多读过本书早期手稿的专业C程序员常常感叹:“就在上星期我还遇到这样一个Bug!”如果你正在教授C语言课程,本书毫无疑问应该成为你向学生推荐的首选补充阅读材料。
本书不是对C语言的批评。程序员无论使用何种程序设计语言,都有可能遇到麻烦。本书浓缩了作者长达10年的C语言开发经验,集中阐述了C语言中各种问题和“陷阱”,目的是希望程序员读者能够从中吸取我本人以及我所见过的其他人所犯错误的经验教训。
本书不是一本“烹饪菜谱”。我们不能希望可以通过详尽的指导说明来完全避免错误。如果可行的话,那么所有的交通事故都可以通过在路旁刷上“小心驾驶”的标语来杜绝。对一般人而言最有效的学习方式是从感性的、活生生的事例中学习,比如自己的亲身经历或者他人的经验教训。而且,哪怕只是明白了一种特定的错误是如何可能发生的,就已经在将来避免该错误的路上迈了一大步。
学习C语言的7个步骤,对照一下,看你处在哪个阶段?
C是编译型语言。如果之前使用过编译型语言(如,Pascal或FORTRAN),就会很熟悉组建C程序的几个基本步骤。但是,如果以前使用的是解释型语言(如,BASIC)或面向图形界面语言(如,Visual Basic),或者甚至没接触过任何编程语言,就有必要学习如何编译。别担心,这并不复杂。首先,为了让读者对编程有大概的了解,我们把编写C程序的过程分解成7个步骤(见图1.3)。注意,这是理想状态。在实际的使用过程中,尤其是在较大型的项目中,可能要做一些重复的工作,根据下一个步骤的情况来调整或改进上一个步骤。
图1.3 编程的7个步骤
1 第1步:定义程序的目标
在动手写程序之前,要在脑中有清晰的思路。想要程序去做什么首先自己要明确自己想做什么,思考你的程序需要哪些信息,要进行哪些计算和控制,以及程序应该要报告什么信息。在这一步骤中,不涉及具体的计算机语言,应该用一般术语来描述问题。
2 第2步:设计程序
对程序应该完成什么任务有概念性的认识后,就应该考虑如何用程序来完成它。例如,用户界面应该是怎样的?如何组织程序?目标用户是谁?准备花多长时间来完成这个程序?
除此之外,还要决定在程序(还可能是辅助文件)中如何表示数据,以及用什么方法处理数据。学习C语言之初,遇到的问题都很简单,没什么可选的。但是,随着要处理的情况越来越复杂,需要决策和考虑的方面也越来越多。通常,选择一个合适的方式表示信息可以更容易地设计程序和处理数据。
再次强调,应该用一般术语来描述问题,而不是用具体的代码。但是,你的某些决策可能取决于语言的特性。例如,在数据表示方面,C的程序员就比Pascal的程序员有更多选择。
3 第3步:编写代码
设计好程序后,就可以编写代码来实现它。也就是说,把你设计的程序翻译成C语言。这里是真正需要使用C语言的地方。可以把思路写在纸上,但是最终还是要把代码输入计算机。这个过程的机制取决于编程环境,我们稍后会详细介绍一些常见的环境。一般而言,使用文本编辑器创建源代码文件。该文件中内容就是你翻译的C语言代码。程序清单1.1是一个C源代码的示例。
程序清单1.1 C源代码示例
在这一步骤中,应该给自己编写的程序添加文字注释。最简单的方式是使用C的注释工具在源代码中加入对代码的解释。第2章将详细介绍如何在代码中添加注释。
4 第4步:编译
接下来的这一步是编译源代码。再次提醒读者注意,编译的细节取决于编程的环境,我们稍后马上介绍一些常见的编程环境。现在,先从概念的角度讲解编译发生了什么事情。
前面介绍过,编译器是把源代码转换成可执行代码的程序。可执行代码是用计算机的机器语言表示的代码。这种语言由数字码表示的指令组成。如前所述,不同的计算机使用不同的机器语言方案。C编译器负责把C代码翻译成特定的机器语言。此外,C编译器还将源代码与C库(库中包含大量的标准函数供用户使用,如printf()和scanf())的代码合并成最终的程序(更精确地说,应该是由一个被称为链接器的程序来链接库函数,但是在大多数系统中,编译器运行链接器)。其结果是,生成一个用户可以运行的可执行文件,其中包含着计算机能理解的代码。
编译器还会检查C语言程序是否有效。如果C编译器发现错误,就不生成可执行文件并报错。理解特定编译器报告的错误或警告信息是程序员要掌握的另一项技能。
5 第5步:运行程序
传统上,可执行文件是可运行的程序。在常见环境(包括Windows命令提示符模式、UNIX终端模式和Linux终端模式)中运行程序要输入可执行文件的文件名,而其他环境可能要运行命令(如,在VAX中的VMS[2])或一些其他机制。例如,在Windows和Macintosh提供的集成开发环境(IDE)中,用户可以在IDE中通过选择菜单中的选项或按下特殊键来编辑和执行C程序。最终生成的程序可通过单击或双击文件名或图标直接在操作系统中运行。
6 第6步:测试和调试程序
程序能运行是个好迹象,但有时也可能会出现运行错误。接下来,应该检查程序是否按照你所设计的思路运行。你会发现你的程序中有一些错误,计算机行话叫作bug。查找并修复程序错误的过程叫调试。学习的过程中不可避免会犯错,学习编程也是如此。因此,当你把所学的知识应用于编程时,最好为自己会犯错做好心理准备。随着你越来越老练,你所写的程序中的错误也会越来越不易察觉。
将来犯错的机会很多。你可能会犯基本的设计错误,可能错误地实现了一个好想法,可能忽视了输入检查导致程序瘫痪,可能会把圆括号放错地方,可能误用C语言或打错字,等等。把你将来犯错的地方列出来,这份错误列表应该会很长。
看到这里你可能会有些绝望,但是情况没那么糟。现在的编译器会捕获许多错误,而且自己也可以找到编译器未发现的错误。在学习本书的过程中,我们会给读者提供一些调试的建议。
7 第7步:维护和修改代码
创建完程序后,你发现程序有错,或者想扩展程序的用途,这时就要修改程序。例如,用户输入以Zz开头的姓名时程序出现错误、你想到了一个更好的解决方案、想添加一个更好的新特性,或者要修改程序使其能在不同的计算机系统中运行,等等。如果在编写程序时清楚地做了注释并采用了合理的设计方案,这些事情都很简单。
8 说明
编程并非像描述那样是一个线性的过程。有时,要在不同的步骤之间往复。例如,在写代码时发现之前的设计不切实际,或者想到了一个更好的解决方案,或者等程序运行后,想改变原来的设计思路。对程序做文字注释为今后的修改提供了方便。
许多初学者经常忽略第1步和第2步(定义程序目标和设计程序),直接跳到第3步(编写代码)。刚开始学习时,编写的程序非常简单,完全可以在脑中构思好整个过程。即使写错了,也很容易发现。但是,随着编写的程序越来越庞大、越来越复杂,动脑不动手可不行,而且程序中隐藏的错误也越来越难找。最终,那些跳过前两个步骤的人往往浪费了更多的时间,因为他们写出的程序难看、缺乏条理、让人难以理解。要编写的程序越大越复杂,事先定义和设计程序环节的工作量就越大。
磨刀不误砍柴工,应该养成先规划再动手编写代码的好习惯,用纸和笔记录下程序的目标和设计框架。这样在编写代码的过程中会更加得心应手、条理清晰。
C伴侣推荐
1、C Primer Plus 第6版 中文版
[美] 史蒂芬·普拉达(Stephen Prata) 著,姜佑 译
- 畅销的重量级C语言大百科全书
- C语言从入门到精通的入门经典
- 第五版销售超过250000册
本书详细讲解了C语言的基本概念和编程技巧。
全书共17章。第1章、第2章介绍了C语言编程的预备知识。第3章~第15章详细讲解了C语言的相关知识,包括数据类型、格式化输入/输出、运算符、表达式、语句、循环、字符输入和输出、函数、数组和指针、字符和字符串函数、内存管理、文件输入和输出、结构、位操作等。第16章、第17章介绍C预处理器、C库和高级数据表示。本书以丰富多样的程序为例,讲解C语言的知识要点和注意事项。每章末尾设计了大量复习题和编程练习,帮助读者巩固所学知识和提高实际编程能力。附录给出了各章复习题的参考答案和丰富的参考资料。
2、C Primer Plus 第6版 中文版习题解答
史蒂芬·普拉达(Stephen Prata),曹良亮 编
- 经典畅销图书《C,Primer,Plus》的学习伴侣
- 北京师范大学名师详细剖析所有题目
- 全面提升C编程能力的优选编程练习册
这是经久不衰的C语言畅销经典教程《C Primer Plus(第6版)中文版》的习题精解教程图书。 为了锻炼并提升读者的动手编程能力,《C Primer Plus(第6版)》除了在每章正文中包含了大量短小精悍的实例之外,还在每章末尾提供了颇有深度的综合性的复习题和编程练习题。 本书编者曹良亮博士尝试对这些复习题和编程练习给出了自己的理解和解答。 本书每章开篇先采用思维导图的形式给出了本章涵盖的知识点,然后采用简练的文字梳理了每章涉及的理论内容,最后对复习题和编程练习进行了详细的剖析,最后给出了解题思路和代码实现。 作为《C Primer Plus(第6版)》的理想学习伴侣,本书可以切实提升C语言初学人员的编程技能,掌握C语言编程的精髓,为后期的程序开发之路打下坚实基础。
本文作者及来源:Renderbus瑞云渲染农场https://www.renderbus.com
文章为作者独立观点不代本网立场,未经允许不得转载。