第1章 C言概述
- 格式:doc
- 大小:579.00 KB
- 文档页数:10
C Primer Plus(第五版)学习笔记第一章概览1.1 C语言的起源记住Dennis Ritchie和Ken Thomson。
是在设计UNIX操作系统的时候开发的。
1.2 使用C语言的理由C是一种融合了控制特性的现代语言,而我们已发现在计算机科学的理论和实践中,控制特性是很重要的。
其设计使得用户可以自然地采用自顶向下的规划、结构化的编程,以及模块化的设计。
这种做法使得编写出的程序更可靠、更易懂。
C是一种高效的语言。
C程序往往很紧凑且运行速度快。
C是一种可移植语言。
由于C与UNIX的紧密联系,UNIX系统通常都带有一个C编译器作为程序包的一部分。
Linux中同样也包括一个C 编译器。
C强大而又灵活(计算机世界中经常使用的两个词)。
C面向编程人员的需要。
它允许您访问硬件,并可以操纵内存中的特定位。
它具有丰富的运算符供选择,让您能够简洁地表达自己的意图。
多数C实现都有一个大型的库,其中包含有用的C函数。
这些函数能够处理编程人员通常会面对的许多需求。
C的简洁性与其丰富的运算符相结合,使其可能会编写出极难理解的代码。
没有谁强迫您编写含糊难懂的代码,但存在这样的可能性。
试问,除C之外还有哪种语言存在一年一度的“含糊代码”(ObfuscatedCode)竞赛呢?1.3 C语言的发展方向不管C++和Java这些较新的语言如何流行,C在软件产业仍然是一种重要的技能,在最想获得的技能中,它一般都列在前10名。
特别是在嵌入式系统的编程中,C已开始流行。
也就是说,它将用来为汽车、照相机、DVD播放器和其他现代化设备中逐渐普及的微处理器编程。
同样,C已开始进入长期以来一直属于FORTRAN的科学编程领域。
最后,由于它是一种适合用来开发操作系统的语言,C在Linux的开发中也扮演着重要的角色。
1.4 计算机工作的基本原理CPU的工作非常简单,至少在我们所做的这一简短描述中是这样的。
它从内存中获取一个指令并执行该指令,然后从内存中获取下一个指令并执行。
《c语言教程(原书第4版)》前言第0章从零开始10.1 为什么要用c 10.2 ansi c标准20.3 从c到c++ 30.4 从c和c++到java 3第1章c语言概述41.1 编程和预备知识41.2 程序输出41.3 变量、表达式和赋值71.4 使用#define和#include 91.5 使用printf()和scanf() 121.6 控制流141.7 函数191.8 数组、字符串和指针241.8.1 数组241.8.2 字符串251.8.3 指针281.9 文件31.1.10 与操作系统有关的内容351.10.1 编写和运行c程序351.10.2 中断程序361.10.3 输入文件尾标志371.10.4 输入和输出的重定向371.11 总结381.12 练习39第2章词法元素、操作符和c系统45 2.1 字符和词法元素462.2 语法规则482.3 注释492.4 关键字502.5 标识符502.6 常量512.7 字符串常量522.8 操作符和标点符号532.9 操作符的优先级和结合性532.10 增值操作符和减值操作符552.11 赋值操作符562.12 例子:计算2的乘方572.13 c系统582.13.1 预处理器592.13.2 标准函数库592.15 练习63第3章基本数据类型693.1 声明、表达式和赋值693.2 基本数据类型713.3 字符和char数据类型723.4 int数据类型753.5 整数类型short、long和unsigned 763.6 浮点类型773.7 typedef的用法793.8 sizeof操作符793.9 使用getchar()和putchar() 803.10 数学函数823.10.1 使用abs()和fabs() 843.10.2 unix和数学函数库843.11 隐式类型转换和强制类型转换843.11.1 整型提升853.11.2 寻常算术转换853.11.3 强制类型转换863.12 十六进制和八进制常量873.13 总结893.14 练习89第4章控制流964.1 关系操作符、相等操作符和逻辑操作符96 4.2 关系操作符和表达式974.3 相等操作符和表达式994.4 逻辑操作符和表达式1004.5 复合语句1034.6 表达式和空语句1034.7 if和if-else语句1044.8 while语句1064.9 for语句1084.10 例子:布尔变量1104.11 逗号操作符1114.12 do语句1124.13 例子:斐波那契数1134.14 goto语句1154.15 break和continue语句1164.16 switch语句1174.17 条件操作符1184.18 总结1194.19 练习120第5章函数1285.1 函数定义1285.2 return语句1305.3 函数原型1315.4 例子:创建乘方表1325.5 从编译器的角度观察函数原型1335.6 函数定义顺序的另一种风格1345.7 函数调用和传值调用1345.8 开发大型程序1365.9 使用断言1385.10 作用域规则1395.10.1 平行和嵌套代码块1405.10.2 以调试为目的使用代码块1405.11 存储类型1415.11.1 auto存储类型1415.11.2 extern存储类型1415.11.3 register存储类型1435.11.4 static存储类型1435.12 静态外部变量1445.13 默认初始化1455.14 递归1455.15 例子:汉诺塔1495.16 总结1525.17 练习153第6章数组、指针和字符串1596.1 一维数组1596.1.1 初始化1606.1.2 下标1606.2 指针1616.3 传引用调用1646.4 数组和指针之间的关系1656.5 指针运算和元素的大小1666.6 数组作为函数的实参1666.7 例子:冒泡排序1676.8 用calloc()和malloc()进行动态内存分配168 6.9 例子:归并和归并排序1716.10 字符串1756.11 标准函数库中的字符串处理函数1776.12 多维数组1806.12.1 二维数组1806.12.2 存储映射函数1806.12.3 形式参数声明1816.12.4 三维数组1826.12.5 初始化1826.12.6 使用typedef 1836.13 指针数组1846.14 main()函数的参数1886.15 不规则数组1896.16 函数作为参数1906.17 例子:使用二分法寻找函数的根192 6.18 函数指针数组1966.19 类型限定符const和volatile 1996.20 总结2006.21 练习202第7章位操作符和枚举类型2147.1 位操作符和表达式2147.1.1 按位求反2157.1.2 补码2157.1.3 位逻辑操作符2167.1.4 左移位和右移位操作符2177.2 掩码2187.3 软件工具:打印int值的二进制形式219 7.4 包装和解包2207.5 枚举类型2237.6 例子:“石头、剪刀、布”游戏2257.7 总结2297.8 练习230第8章预处理器2358.1 #include的使用2358.2 使用#define 2368.3 带参数的宏2378.4 stddef.h中的类型定义和宏2398.5 例子:用qsort()进行排序2398.6 例子:带参数的宏2438.7 stdio.h和ctype.h中的宏2468.8 条件编译2478.9 预定义的宏2498.10 “#”和“##”操作符2498.11 assert()宏2508.12 使用#error和#pragma 2508.13 行号2518.14 对应的函数2518.15 例子:快速排序2518.16 总结2548.17 练习254第9章结构和联合2629.1 结构2629.2 访问结构成员2649.3 操作符的优先级和结合性的总结267 9.4 在函数中使用结构2689.5 结构的初始化2699.6 例子:玩扑克牌2699.7 联合2739.8 位字段2759.9 例子:访问位和字节2769.10 adt堆栈2779.11 总结2809.12 练习281第10章结构和列表处理28810.1 自引用的结构28810.2 线性链表28910.3 链表操作29010.4 一些链表处理函数29310.4.1 插入29410.4.2 删除29510.5 堆栈29610.6 例子:波兰记法和堆栈求值298 10.7 队列30310.8 二叉树30610.8.1 二叉树的遍历30710.8.2 创建树30810.9 普通的树30910.9.1 遍历31110.9.2 calloc()的用法以及树的创建311 10.10 总结31210.11 练习313第11章输入/输出和操作系统318 11.1 输出函数printf() 31811.2 输入函数scanf() 32111.3 fprintf()、fscanf()、sprintf()和sscanf()函数32411.4 fopen()和fclose()函数32511.5 例子:对文件进行空间加倍327 11.6 使用临时文件和优雅函数329 11.7 随机访问文件33111.8 文件描述符输入/输出33211.9 文件访问权限33311.10 在c程序内部执行命令334 11.11 在c程序内部使用管道335 11.12 环境变量33611.13 c编译器33711.14 使用性能评估程序33811.15 函数库33911.16 对c代码进行计时34011.17 使用make 34311.18 使用touch 34711.19 其他有用的工具34811.20 总结34911.21 练习350第12章高级应用35812.1 用fork()创建并发进程35812.2 进程的叠加:exec...()函数族系360 12.3 使用pipe()实现进程间的通信362 12.4 信号36312.5 例子:哲学家用餐问题36512.6 矩阵的动态分配36812.6.1 为什么二维数组无法满足要求368 12.6.2 用指针数组创建矩阵36912.6.3 调整下标范围37112.6.4 一次分配所有内存37312.7 返回状态37412.8 总结37712.9 练习378第13章从c到c++ 38313.1 输出38313.2 输入38413.3 函数38613.4 类和抽象数据类型38713.5 重载38913.6 构造函数和析构函数39013.7 面向对象编程和继承39213.8 多态39313.9 模板39513.10 c++的异常39613.11 面向对象编程的优点39613.12 总结39713.13 练习398第14章从c到java 40214.1 输出40214.2 变量和类型40314.3 类和抽象数据类型40414.4 重载40614.5 类的创建和销毁40614.6 面向对象编程和继承40614.7 多态和重写方法40714.8 applet 40814.9 java的异常40914.10 java和oop的优势41014.11 总结41014.12 练习411附录a 标准函数库413附录b c的语法441附录c ansi c与传统c的比较446附录d ascii字符码452附录e 操作符的优先级和结合性454。
第一章C语言基础知识考点 1 C语言程序的结构认识本节通过一个简单的c程序例子,介绍c语言的基本构成、格式、以及良好的书写风格,使读者对c语言有个初步认识。
例1 计算两个整数之和的c程序:#include<stdio.h>main(){int a,b,sum; /*定义变量a,b,sum为整型变量*/a=20; /*把整数20赋值给整型变量a*/b=15; /*把整数15赋值给整型变量b*/sum=a+b; /*把两个数之和赋值给整型变量sum*/printf(“a=%d,b=%d,sum=%d\n”,a,b,sum);/*把计算结果输出到显示屏上*/}重点说明:1、任何一个c语言程序都必须包括以下格式:main(){ }这是c语言的基本结构,任何一个程序都必须包含这个机构。
括号内可以不写任何内容,那么该程序将不执行任何结果。
2、main()----在c语言中称之为“主函数”,一个c程序有且仅有一个main函数,任何一个c 程序总是从main函数开始执行,main函数后面的一对圆括号不能省略。
3、被大括号{ }括起来的内容称为main函数的函数体,这部分内容就是计算机要执行的内容。
4、在{ }里面每一句话后面都有一个分号(;),在c语言中,我们把以一个分号结尾的一句话叫做一个c语言的语句,分号是语句结束的标志。
5、printf(“a=%d,b=%d,sum=%d\n”,a,b,sum); ----通过执行这条c语言系统提供给我们直接使用的屏幕输出函数,用户即可看到运行结果,本程序运行后,将在显示器上显示如下结果:a=20,b=15,sum=356、#include<stdio.h>注意:(1)以#号开头(2)不以分号结尾这一行没有分号,所以不是语句,在c语言中称之为命令行,或者叫做“预编译处理命令”。
7、程序中以/*开头并且以*/结尾的部分表示程序的注释部分,注释可以添加在程序的任何位置,为了提高程序的可读性而添加,但计算机在执行主函数内容时完全忽略注释部分,换而言之就是计算机当做注释部分不存在于主函数中。
第1章C语言概述1.1 本章讲述的内容本章讲述如下内容:(1)C语言的由来和发展。
(2)C语言的特点和应用。
(3)C语言程序在结构上的特点和书写格式上的要求。
(4)C语言程序中出现的键盘输入操作和屏幕输出操作的方法。
(5)使用Visual C++ 6.0编译系统来实现的单文件程序和多文件程序的操作步骤。
本章是本书的第1章,通过讲述本章内容,实际上是给学生回答下述一些问题:(1)什么是C语言?它为什么使用较为普遍?(2)C语言与其他语言有何不同?(3)C语言程序是什么样子的?在结构上有哪些特点?(4)编写的C语言程序如何获得其输出结果?如何学好C语言?通过对本章内容的讲述让学生得到如下收获:(1)激发学生学习C语言的兴趣,使学生一开始就下定决心学好C语言编程。
(2)增强学生学好C语言的信心。
通过课堂上认真听讲,课后看书复习完成作业,加强上机实践,存在的问题及时解决,并不难学好这门功课。
(3)掌握好上机实践这一重要环节。
从一开始就要重视上机实践,学会通过上机实践来解决疑难问题,培养自学能力和动手能力。
1.2 重点内容本章的重点内容有如下3点。
1.2.1 C语言的特点讲述C语言的特点时,一定要一分为二:既要讲述C语言吸取其他语言的经验和教训,使C语言超越其他语言特点,这些特点作为C语言的优点受到许多编程者的赞许,又要讲述C语言由于过于强调它的某些特点而带来的一些不足,或者说是“隐患”,而被后来的C++语言进行了改进。
总之,讲述C语言要实事求是,让学生对C语言有个全面的正确的认识,从而会对任何事物总要用一分为二的观点来认识。
1.C语言的优点讲述C语言特点时,主要讲述它的优点,即它吸引编程者的魅力所在。
(1)C语言语句简练、书写方便在这一点上,很多语言难以与C语言相比,主要表现在以下几个方面。
•使用缩写的类型说明符,使得书写方便。
特别是对最常用的类型,如整型用int,字符型char,只用英文单词的前边一部分,而不像有的语言使用全部英文单词。
•运算符比较多,有的运算符功能很强。
运算符大多可将许多操作使用表达式来表示,而不必用函数实现,这样做不仅书写简单,而且可读性也好。
C语言中引进一个三目运算符,这是其他语言少有的,这个三目运算符功能强,具有简单条件语句(if-else语句)的功能。
自然,使用条件表达式语句比用条件语句简练。
•采用花括号作定界符,比用语句或其他方法更为方便。
C语言中,函数体的定界符、条件语句的if体、else if体和else体的定界符以及循环语句的循环体的定界符都用一对花括号({}),这样做既简练,又方便。
这比有些语言使用begin和end等标识符要简单得多。
特别是又规定了如果if体、循环体是一条语句就不用定界符了。
•讲到书写方便,不得不讲讲预处理功能。
特别是该功能的文件包含命令,将多个程序中相重复的部分提取出来,写在一个被包含的文件中,只要在需要这部分内容的程序中包含该文件就可以了,而不必重复写一遍。
此外,符号常量的引入也在某种程度为书写带来一定方便。
(2)C语言的功能特强C语言功能强主要表现在它既具有高级语言的特性,又具有低级语言的特性。
有人说它是一种中级语言,但是这种讲法反映不出它的功能之强大。
C语言功能强表现在如下几个方面。
•C语言具有高级语言的所有功能,此外,在字符处理方面采用了字符指针等措施,更加便于字符处理。
•C语言具有地址操作和位操作以及寄存器操作等功能,这是功能是一般高级语言所不具有的,这是兼容了汇编语言的功能。
•C语言引进指针的概念,为地址操作带来了方便,同时指针又为数组元素的表示及作为函数的参数带来了操作上的方便和功能上的增强。
例如,传址调用可实现函数之间信息的传递等。
•C语言还具有丰富的数据类型和存储类。
在数据类型方面,除了基本数据类型外,还提供了数组、结构、联合和枚举等构造类型,使C语言程序可以方便地实现各种复杂数据类型的操作,多种的存储类也为C语言适应不同情况的需要提供方便,进一步增强了该语言的功能。
(3)C语言是一种结构化的程序设计语言结构化程序设计语言的出现是编程史上的一个里程碑。
结构化程序设计语言要具备构成结构化程序设计的三种基本结构模式的语句。
这三种基本结构模式分别是:•顺序结构模式。
•分支结构模式。
•循环结构模式。
C语言具有构成上述三种结构模式的语句,所以C语言是人们比较喜欢的一种结构化程序设计语言,因为它具有前边讲述的两大特点。
但是,还应该看到,C语言是一种不完全的结构化程序设计语言。
它的不完全性表现在如下两点:•C语言允许使用goto语句,但是对它的goto范围进行限制只允许在函数体内进行转向。
因此,C语言中最小的模块是函数。
•完全的结构化程序设计语言要求一个模块只有一个入口和一个出口。
不过,C语言中函数作为最小模块,它虽然有一个入口,但是可以有两个或两个以上的出口。
因为函数内允许有多个return语句。
(4)C语言的移植性好移植性好是C语言的另一个优点,这也是C语言能够广泛用于各种型号机器上去的原因。
C语言移植性好的原因是因为该语言的编译系统较小,再加上它具有若干预处理命令,可在编译前就处理一些命令,这都给C语言的移植带来了方便。
2.C语言的不足C语言过于强调它的某些特点,即灵活和简洁,也由此带来了一些不足。
(1)运算符过多,优先级较繁杂,使用者觉得难用难记运算符共有44个,优先级有15种,结合性还有两类。
这无疑对数据运算带来方便,但是,对编程者带来了难记和难用的不便。
例如,运算符星号(*)具有两个功能,作为单目运算符表示取内容,作为双目运算符表示相乘运算等等。
(2)C语言是一种弱类型的语言C语言为了类型转换的方便,对类型的要求很不严格,在许多情况下不做类型检查。
在有些情况下,C语言要求类型一致,由于不做类型检查,出现不一致时也不报错,结果造成了运算结果的错误。
因此,在编程中对类型处理一定要慎重,应尽量避免因类型不一致造成的差错。
(3)对数组进行动态赋值时不做越界检查这样,当给某个数组进行动态赋值时,若赋值个数超过了数组元素的个数,就可能造成数据上的混乱。
指针的使用上也要特别注意,只有给指针赋以确定值时才可以使用。
由于字符指针被赋值后它所指向新的字符串大小被确定,当用该指针再指向新的字符串时,要注意字符串长度可能引起的越界。
因此,在有些情况下,使用字符指针不合适时,应使用字符数组。
(4)产生二义性C语言出于优化的考虑,允许不同的编译系统对表达式或参数表中的操作数或数据项的计算顺序有所不同,即有的编译系统规定计算顺序从左至右,有的编译系统规定计算顺序从右至左。
这对于有副作用运算符组成的操作数或数据项来讲,有可能产生二义性,编程时应尽量避免。
1.2.2 C语言程序在结构上的特点从C语言的具体程序实例中可以看到,C语言程序在结构上的特点如下:•C语言程序是由一个或多个文件组成的。
•组成C语言程序的每个文件是由一个或多个函数组成的。
因此,可以说C语言程序是函数串,即C语言程序是由放在不同文件中的若干个函数组成的,函数是组成C语言程序的最小模块。
•组成C语言程序的若干个函数中,有且仅有一个主函数main( )。
主函数所在的文件称为主文件。
执行一个C语言程序时,先从主函数开始执行,程序中其他的函数都是被主函和主函数来调用的函数来调用。
程序中若干个函数先后顺序基本无关。
•函数是由函数头和函数体组成。
函数头给出了函数名字、函数类型、函数参数的个数和类型。
函数体由一对花括号括起的若干条语句组成。
语句是由若干个单词组成的。
另外,由于C语言程序的可读性较差,因此,在书写上要求遵循着如下的约定。
•一行通常写一条语句。
有些语句可以写成多行。
分行书写时不得将一个单词分开。
•每条语句末尾加分号(;),不是语句结束不应加分号。
•花括号的书写按规定的格式。
本书规定:每个括号占一行,左右花括号都与使用它们的语句对齐,花括号内语句向右缩进。
•语句书写时要按约定进行缩进,以便提高可读性。
•适当使用注释信息,可提高可读性。
1.2.3 C语言程序的实现C语言程序的实现指的是如何使编写的C语言程序获得正确的输出结果。
C语言程序的实现方法与其他高级语言的实现方法相同,通常都是通过编辑、编译和运行三个步骤来实现。
本书选用了Visual C++ 6.0集成工具软件系统来实现C语言程序。
这是一个C++语言的编译系统,也能用来编译C语言的程序。
使用该系统实现C语言程序时,与使用TC2.0AK 3.0系统等其他C语言编译系统有如下几点不同。
•每个C语言程序文件存盘时应加 .C后缀,不应默认扩展名。
•每个C语言程序开头都加如下命令:#include <stdio.h>•C程序中所有函数都不可省略类型说明,无返回值的函数加void,返回值为int型的函数加int。
•函数说明应用原型,即在简单说明的基础上加上函数参数和个数的说明。
•定义函数时,函数参数类型说明放在圆括号内,而不再另起一行进行说明。
上述几点都是C++语言程序所要求的。
一开始就让学生学会在Visual C++ 6.0系统上运行C语言程序的方法。
下面分别讲述单文件程序和多文件程序的实现方法。
1.单文件C语言程序的实现方法单文件C语言程序的实现方法如下。
(1)运行Visual C++ 6.0系统,出现该系统的主窗口。
(2)选择菜单栏中的File菜单项,在下拉菜单中选择New选项,出现New对话框。
(3)在New对话框中,选择Files选项卡,出现Files选项卡的内容。
在其中双击C++ Source File选项,出现文本编辑窗口。
(4)将C语言程序逐行输入到计算机中,并可以进行全屏幕编辑。
使用File菜单中的save选项存盘。
在“另存为”对话框的“文件名”文本框内输入文件名,并以 .c作扩展名。
在输入文件前应先选好存放 .c文件的文件夹。
(5)选择菜单栏中的Build菜单项,在该下拉菜单中,选择Build选项,这时系统对工作区中的当前文件进行编译、连接,生成可执行文件。
如果有编译错和连接错误,错误信息将自动出现在屏幕下方窗口中,用户双击某条编译错误信息后,系统将在编辑窗口中使用右箭头指出出错的行。
这时用户可根据出错信息修改错误,修改后再继续编译,直到没错为止。
最终生成可执行文件。
(6)选择Build菜单项中的Execute命令运行该程序,将输出结果显示在一个DOS窗口中。
查看完毕后,按任意键返回原窗口。
编译运行后第一个程序后,在编辑下一个新程序前,应将工作区内的文件清除掉,其方法如下:选择File下拉菜单中Close Workspace选项,出现一个对话框,选择“是”时,将清除工作压中的所有文件,选择“否”时,保留当前文件,清除其他文件。
开始上机时,最好让学生先不清除原来文件就进行运行,看一个会出现什么现象?这样可使学生记住以后出现这种现象应该如何处理。