C语言是国内外广泛使用的计算机语言,是计算机应用人员应掌握的一种程序设计工具。
本书第一版于1991年出版,全书针对初学者的特点,精心策划、准确定位、概念清晰、例题丰富、深入浅出,受到专家和读者的一致好评。普遍认为它是学习C语言的好教材,被全国大多数高校选用。几年来发行量达270万册,创同类书发行量的全国纪录。被电子工业部评为部级优秀教材一等奖。
根据发展的需要,作者对本书进行了修订,加强了算法,按C的新标准改写全书各章,增加了C++的初步知识。
本书内容新颖、体系合理、逻辑性强、文字流畅、通俗易懂,是学习C语言的理想教材。凡具有计算机初步知识的读者都能读懂本书。本书可作为高等学校各专业的正式教材,也是一本自学的好教材。
1 C语言概述\r\n\r\n1.1 C语言出现的历史背景\r\n1.2 C语言的特点\r\n1.3 简单的C程序介绍\r\n1.4 C程序的上机步骤\r\n习题\r\n\r\n2 程序的灵魂——算法\r\n\r\n2.1 算法的概念\r\n2.2 简单算法举例\r\n2.3 算法的特性\r\n2.4 怎样表示一个算法\r\n2.4.1 用自然语言表示算法\r\n2.4.2 用流程图表示算法\r\n2.4.3 三种基本结构和改进的流程图\r\n2.4.4 用N-S流程图表示算法\r\n2.4.5 用伪代码表示算法\r\n2.4.6 用计算机语言表示算法\r\n2.5 结构化程序设计方法\r\n习题\r\n\r\n3 数据类型、运算符与表达式\r\n\r\n3.1 C的数据类型\r\n3.2 常量与变量\r\n3.2.1 常量和符号常量\r\n3.2.2 变量\r\n3.3 整型数据\r\n3.3.1 整型常量的表示方法\r\n3.3.2 整型变量\r\n3.3.3 整型常量的类型\r\n3.4 实型数据\r\n3.4.1 实型常量的表示方法\r\n3.4.2 实型变量\r\n3.4.3 实型常量的类型\r\n3.5 字符型数据\r\n3.5.1 字符常量\r\n3.5.2 字符变量\r\n3.5.3 字符数据在内存中的存储形式及其使用方法\r\n3.5.4 字符串常量\r\n3.6 变量赋初值\r\n3.7 各类数值型数据间的混合运算\r\n3.8 算术运算符和算术表达式\r\n3.8.1 C运算符简介\r\n3.8.2 算术运算符和算术表达式\r\n3.9 赋值运算符和赋值表达式\r\n3.10 逗号运算符和逗号表达式\r\n习题\r\n\r\n4 最简单的C程序设计——顺序程序设计\r\n\r\n4.1 C语句概述\r\n4.2 赋值语句\r\n4.3 数据输入输出的概念及在C语言中的实现\r\n4.4 字符数据的输入输出\r\n4.4.1 putchar函数(字符输出函数)\r\n4.4.2 getchar函数(字符输入函数)\r\n4.5 格式输入与输出\r\n4.5.1 printf函数(格式输出函数)\r\n4.5.2 scanf函数(格式输入函数)\r\n4.6 顺序结构程序设计举例\r\n习题\r\n\r\n5 选择结构程序设计\r\n\r\n5.1 关系运算符和关系表达式\r\n5.1.1 关系运算符及其优先次序\r\n5.1.2 关系表达式\r\n5.2 逻辑运算符和逻辑表达式\r\n5.2.1 逻辑运算符及其优先次序\r\n5.2.2 逻辑表达式\r\n5.3 if语句\r\n5.3.1 if语句的三种形式\r\n5.3.2 if语句的嵌套\r\n5.3.3 条件运算符\r\n5.4 switch语句\r\n5.5 程序举例\r\n习题\r\n\r\n6 循环控制\r\n\r\n6.1 概述\r\n6.2 goto语句以及用goto语句构成循环\r\n6.3 while语句\r\n6.4 do-while语句\r\n6.5 for语句\r\n6.6 循环的嵌套\r\n6.7 几种循环的比较\r\n6.8 break语句和continue语句\r\n6.8.1 break语句\r\n6.8.2 continue语句\r\n6.9 程序举例\r\n习题\r\n\r\n7 数组\r\n\r\n7.1 一维数组的定义和引用\r\n7.1.1 一维数组的定义\r\n7.1.2 一维数组元素的引用\r\n7.1.3 一线数组的初始化\r\n7.1.4 一维数组程序举例\r\n7.2 二维数组的定义和引用\r\n7.2.1 二维数组的定义\r\n7.2.2 二维数组的引用\r\n7.2.3 二维数组的初始化\r\n7.2.4 二维数组程序举例\r\n7.3 字符数组\r\n7.3.1 字符数组的定义\r\n7.3.2 字符数组的初始化\r\n7.3.3 字符数组的引用\r\n7.3.4 字符串和字符串结束标志\r\n7.3.5 字符数组的输入输出\r\n7.3.6 字符串处理函数\r\n7.3.7 字符数组应用举例\r\n习题\r\n\r\n8 函数\r\n\r\n8.1 概述\r\n8.2 函数定义的一般形式\r\n8.3 函数参数和函数的值\r\n8.3.1 形式参数和实际参数\r\n8.3.2 函数的返回值\r\n8.4 函数的调用\r\n8.4.1 函数调用的一般形式\r\n8.4.2 函数调用的方式\r\n8.4.3 对被调用函数的声明和函数原型\r\n8.5 函数的嵌套调用\r\n8.6 函数的递归调用\r\n8.7 数组作为函数参数\r\n8.8 局部变量和全局变量\r\n8.8.1 局部变量\r\n8.8.2 全局变量\r\n8.9 变量的存储类别\r\n8.9.1 动态存储方式与静态存储方式\r\n8.9.2 auto变量\r\n8.9.3 用static声明局部变量\r\n8.9.4 register变量\r\n8.9.5 用extern声明外部变量\r\n8.9.6 用static声明外部变量\r\n8.9.7 关于变量的声明和定义\r\n8.9.8 存储类别小结\r\n8.10 内部函数和外部函数\r\n8.10.1 内部函数\r\n8.10.2 外部函数\r\n8.11 如何运行一个多文件的程序\r\n习题\r\n\r\n9 预处理命令\r\n\r\n9.1 宏定义\r\n9.1.1 不带参数的宏定义\r\n9.1.2 带参数的宏定义\r\n9.2 “文件包含”处理\r\n9.3 条件编译\r\n习题\r\n\r\n10 指针\r\n\r\n10.1 地址和指针的概念\r\n10.2 变量的指针和指向变量的指针变量\r\n10.2.1 定义一个指针变量\r\n10.2.2 指针变量的引用\r\n10.2.3 指针变量作为函数参数\r\n10.3 数组的指针和指向数组的指针变量\r\n10.3.1 指向数组元素的指针\r\n10.3.2 通过指针引用数组元素\r\n10.3.3 数组名作函数参数\r\n10.3.4 指向多维数组的指针和指针变量\r\n10.4 字符串的指针和指向字符串的指针变量\r\n10.4.1 字符串的表示形式\r\n10.4.2 字符串指针作函数参数\r\n10.4.3 对使用字符指针变量和字符数组的讨论\r\n10.5 函数的指针和指向函数的指针变量\r\n10.5.1 用函数指针变量调用函数\r\n10.5.2 用指向函数的指针作函数参数\r\n10.6 返回指针值的函数\r\n10.7 指针数组和指向指针的指针\r\n10.7.1 指针数组的概念\r\n10.7.2 指向指针的指针\r\n10.7.3 指针数组作main函数的形参\r\n10.8 有关指针的数据类型和指针运算的小结\r\n10.8.1 有关指针的数据类型的小结\r\n10.8.2 指针运算小结\r\n10.8.3 void指针类型\r\n习题\r\n\r\n11 结构体与共用体\r\n\r\n11.1 概述\r\n11.2 定义结构体类型变量的方法\r\n11.3 结构体变量的引用\r\n11.4 结构体变量的初始化\r\n11.5 结构体数组\r\n11.5.1 定义结构体数组\r\n11.5.2 结构体数组的初始化\r\n11.5.3 结构体数组应用举例\r\n11.6 指向结构体类型数据的指针\r\n11.6.1 指向结构体变量的指针\r\n11.6.2 指向结构体数组的指针\r\n11.6.3 用结构体变量和指向结构体的指针作函数参数\r\n11.7 用指针处理链表\r\n11.7.1 链表概述\r\n11.7.2 简单链表\r\n11.7.3 处理动态链表所需的函数\r\n11.7.4 建立动态键表\r\n11.7.5 输出链表\r\n11.7.6 对链表的删除操作\r\n11.7.7 对链表的插入操作\r\n11.7.8 对链表的综合操作\r\n11.8 共用体\r\n11.8.1 共用体的概念\r\n11.8.2 共用体变量的引用方式\r\n11.8.3 共用体类型数据的特点\r\n11.9 枚举类型\r\n11.10 用typedef定义类型\r\n习题\r\n\r\n12 位运算\r\n\r\n12.1 位运算符和位运算\r\n12.1.1 “按位与”运算符(&)\r\n12.1.2 按位或运算符(|)\r\n12.1.3 “异或”运算符(^)\r\n12.1.4 “取反”运算符(~)\r\n12.1.5 左移运算符(<<)\r\n12.1.6 右移运算符(>>)\r\n12.1.7 位运算赋值运算符\r\n12.1.8 不同长度的数据进行位运算\r\n12.2 位运算举例\r\n12.3 位段\r\n习题\r\n\r\n13 文件\r\n\r\n13.1 C文件概述\r\n13.2 文件类型指针\r\n13.3 文件的打开与关闭\r\n13.3.1 文件的打开(fopen函数)\r\n13.3.2 文件的关闭(fclose函数)\r\n13.4 文件的读写\r\n13.4.1 fputc函数和fgetc函数(putc函数和getc函数)\r\n13.4.2 fread函数和fwrite函数\r\n13.4.3 fprintf函数和fscanf函数\r\n13.4.4 其他读写函数\r\n13.5 文件的定位\r\n13.5.1 rewind函数\r\n13.5.2 fseek函数和随机读写\r\n13.5.3 fiell函数\r\n13.6 出错的检测\r\n13.6.1 ferror函数\r\n13.6.2 clearerr函数\r\n13.7 文件输入输出小结\r\n习题\r\n\r\n14 C++对C的扩充\r\n\r\n14.1 C++的特点\r\n14.2 最简单的C++程序\r\n14.3 C++的输入输出\r\n14.3.1 用cout进行输出\r\n14.3.2 用cin进行输入\r\n14.4 函数的重载\r\n14.5 带缺省参数的函数\r\n14.6 变量的引用类型\r\n14.6.1 引用的概念\r\n14.6.2 引用的简单使用\r\n14.6.3 引用作为函数参数\r\n14.7 内置函数\r\n14.8 作用域运算符\r\n14.9 动态分配/撤销内存的运算符new和delete\r\n14.10 小结\r\n\r\n15 C++的面向对象基础\r\n\r\n15.1 概述\r\n15.2 类和对象\r\n15.3 构造函数和折构函数\r\n15.3.1 构造函数\r\n15.3.2 析构函数\r\n15.4 继承与派生\r\n15.4.1 继承与派生的概念\r\n15.4.2 建立派生类的方法\r\n15.4.3 公用派生类\r\n15.4.4 私有派生类\r\n15.4.5 保护成员\r\n15.4.6 派生类的构造函数\r\n15.4.7 继承在软件开发中的重要意义\r\n\r\n16 常见错误和程序调试\r\n\r\n16.1 常见错误分析\r\n16.2 程序调试\r\n\r\n附录Ⅰ 常用字符与ASCII代码对照表\r\n附录Ⅱ C语言中的关键字\r\n附录Ⅲ 运算符和结合性\r\n附录Ⅳ C语言常用语法提要\r\n附录Ⅴ C库函数\r\n\r\n参考文献
C语言是近年来在国内外得到迅速推广应用的一种计算机语言。C语言功能丰富,表达能力强,使用灵活方便,应用面广,目标程序效率高,可移植性好,既具有高级语言的优点,又具有低级语言的许多特点。因此,C语言特别适合于编写系统软件。C语言诞生后,许多原来用汇编语言编写的软件,现在可以用C语言编写了(例如,著名的UNIX操作系统就是用C语言编写的),而学习和使用C语言要比学习和使用汇编语言容易得多。
现在,C语言已不仅为计算机专业工作者所使用,而且为广大计算机应用人员(包括大量非计算机专业出身的使用计算机的人们)所喜爱和使用。许多高等学校,不仅在计算机专业开设了C语言课程,而且在非计算机专业也开设了C语言课程。全国计算机等级考试、全国计算机应用技术证书考试(NIT)和全国各地区组织的大学生计算机统一考试都将C语言列入了考试范围。许多人已经用它编写应用软件。学习C语言已经成为广大计算机应用人员和广大青年学生的迫切要求。
由于C语言牵涉到的概念比较复杂,规则繁多,使用灵活,容易出错,不少初学者感到困难,迫切希望有一本易于入门、容易学习的C语言教材。在许多同志的鼓励和督促下,作者于1991年编写了一本《C程序设计》,由清华大学出版社出版,以期抛砖引玉。该书针对初学者的特点和认识规律,精选内容,分散难点,降低台阶,例题丰富,通过通俗易懂的叙述阐明了复杂的概念,并力求做到内容新颖、概念清晰、实用性强、通俗易懂。该书出版后受到广大读者的热烈欢迎,许多学校的老师和学生寄来了热情洋溢的信件,认为该书“是学习C语言的好教材”,“使初学者少走了许多弯路”,“使我们对C语言由害怕到兴趣盎然”。全国大多数高校采用该书为教材。许多在职干部和计算机爱好者通过自学该书掌握了C语言程序设计。几年来,该书发行量超过270万册,创全国同类书发行量的首位,荣获国家电子工业部优秀教材一等奖、全国高等院校计算机基础教育研究会优秀教材一等奖、全国大学出版社优秀畅销书特等奖。这是对作者的莫大鼓励和鞭策。我深切地感受到广大读者对作者的殷切期望。
根据计算机科学技术的发展,尤其是C语言的发展,在广大读者的敦促下,我对《C程序设计》一书进行了修订,出版第二版。本书保持了第一版的写作风格,保留了通俗易懂的特点,并在以下几方面做了较大的修改补充:
(1)加强了算法。专门增加了第2章(程序的灵魂——算法),介绍算法的概念和结构化程序设计方法。已学过其他语言程序设计的读者可以跳过本章。
(2)以新标准C的规定为依据,对书中各个部分进行修改,例如对函数形参的声明采用现代方式,允许对非静态数组初始化等。
(3)对各章内容和文字均细致地进行了修改,以使读者更容易理解。
(4)为了使读者对C++有初步的了解,为今后学习C++打下初步基础,专门增加了第14和15章,介绍C++的初步知识,供读者选学。
相信修订后的第二版会更加符合读者的需要。
作者认为,在学校中学习程序设计的目的是进行程序设计的基本训练,而不是要求学生立即编写大型程序,也不能设想今后一辈子只使用在学校里学过的某一种语言。因此,学习程序设计课程时,应该把精力放在最基本、最常用的内容上,开始时不必在每一个细节上死背死抠,在有一定基础后再深入到一些常见的细节,有一些细节是需要通过较长期的实践才能熟练地掌握。初学时切忌过早地滥用C的某些容易引起错误的细节(如不适当地使用++和一一的副作用)。学习程序设计,一定要学活用活,不要死学不会用,要举一反三,在以后需要时能很快地掌握一种新的语言。
程序设计是一门实践性很强的课程,既要掌握概念,又要动手编程,还要上机调试运行。希望读者一定要重视实践环节,包括编程和上机。衡量这门课学习的好坏,不是看“知不知道”,而是看“会不会干”。不要满足于能答出是非题和选择题,而应当把重点放在编制程序和调试程序上。
为了帮助读者学习本书,作者还编写了一本《C程序设计题解与上机指导(第二版)》,提供本书中各章习题的绝大部分参考答案以及上机实习指导,由清华大学出版社于2000年出版。
作者从事计算机教育和计算机普及工作20年来,最深刻的体会是:作者心中要永远装着读者,要处处为读者考虑,要和读者“将心比心”。要深入了解自己工作的对象,准确定位。认真研究他们的认识规律,有的放矢。用读者容易理解的方法进行叙述,深入浅出。我的心中经常感受到千万读者殷切期望的目光。读者热切地期望作者能为他们写出一批好书,使他们的学习能事半功倍。作者多年来以此来鞭策自己,希望能摸索出一些能减少初学者困难的经验,并做了一些探索和尝试。要写好一本书,是不容易的。写书不仅是简单地把有关的技术内容告诉读者,而且要考虑怎样写才能使读者容易理解。要下很大的功夫,有时为了找到一个好的例子或一个通俗的比喻,苦苦思索好几天,每一句话都要反复斟酌推敲。我们殷切希望计算机界的同行们,能共同努力,研究和探索计算机教学和教材建设的规律,写出更多的好书,使更多的人更容易地进入计算机应用的大门。
谭亦峰同志参加了本书部分章节的编写和程序调试工作。由于作者水平有限,本书肯定会有不少缺点和不足,热切期望得到专家和读者的批评指正。
最后,对多年来关心支持本书和本书作者的领导和同志们表示由衷的感谢。尤其是原国务委员、科委主任、现任全国政协副主席、中国工程院院长宋健院士,全国人大副委员长、原中国科学院院长卢嘉锡院士,原中国计算机学会理事长、中国科学院资深院士张效祥先生等前辈给予作者有力的支持和指导。全国高等院校计算机基础教育研究会副理事长刘瑞挺教授、史济民教授、吴文虎教授、张森教授、高林教授多年来始终全力支持和帮助作者在计算机教育和计算机普及领域所从事的工作。全国高校广大教师多年来和我们共同奋斗,千万读者每时每刻都给予我们巨大的、宝贵的关心和支持。清华大学出版社十几年始终与我们密切合作,没有这一切,我将一事无成。我永远感谢曾经帮助和支持过我的、我相识的和不相识的同志和朋友。