C Primer Plus第五版学习笔记.docx
- 文档编号:30185344
- 上传时间:2023-08-05
- 格式:DOCX
- 页数:36
- 大小:707.31KB
C Primer Plus第五版学习笔记.docx
《C Primer Plus第五版学习笔记.docx》由会员分享,可在线阅读,更多相关《C Primer Plus第五版学习笔记.docx(36页珍藏版)》请在冰豆网上搜索。
CPrimerPlus第五版学习笔记
CPrimerPlus(第五版)学习笔记
第一章概览
1.1C语言的起源
记住DennisRitchie和KenThomson。
是在设计UNIX操作系统的时候开发的。
1.2使用C语言的理由
C是一种融合了控制特性的现代语言,而我们已发现在计算机科学的理论和实践中,控制特性是很重要的。
其设计使得用户可以自然地采用自顶向下的规划、结构化的编程,以及模块化的设计。
这种做法使得编写出的程序更可靠、更易懂。
C是一种高效的语言。
C程序往往很紧凑且运行速度快。
C是一种可移植语言。
由于C与UNIX的紧密联系,UNIX系统通常都带有一个C编译器作为程序包的一部分。
Linux中同样也包括一个C编译器。
C强大而又灵活(计算机世界中经常使用的两个词)。
C面向编程人员的需要。
它允许您访问硬件,并可以操纵内存中的特定位。
它具有丰富的运算符供选择,让您能够简洁地表达自己的意图。
多数C实现都有一个大型的库,其中包含有用的C函数。
这些函数能够处理编程人员通常会面对的许多需求。
C的简洁性与其丰富的运算符相结合,使其可能会编写出极难理解的代码。
没有谁强迫您编写含糊难懂的代码,但存在这样的可能性。
试问,除C之外还有哪种语言存在一年一度的“含糊代码”(ObfuscatedCode)竞赛呢?
1.3C语言的发展方向
不管C++和Java这些较新的语言如何流行,C在软件产业仍然是一种重要的技能,在最想获得的技能中,它一般都列在前10名。
特别是在嵌入式系统的编程中,C已开始流行。
也就是说,它将用来为汽车、照相机、DVD播放器和其他现代化设备中逐渐普及的微处理器编程。
同样,C已开始进入长期以来一直属于FORTRAN的科学编程领域。
最后,由于它是一种适合用来开发操作系统的语言,C在Linux的开发中也扮演着重要的角色。
1.4计算机工作的基本原理
CPU的工作非常简单,至少在我们所做的这一简短描述中是这样的。
它从内存中获取一个指令并执行该指令,然后从内存中获取下一个指令并执行。
一个千兆CPU可以再一秒钟内进行大约一亿次这样的操作,然后CPU能以惊人的速度来从事其枯燥的工作。
CPU有自己的小工作区,该工作区由若干个寄存器(register)组成,每个寄存器可以保存一个数。
一个寄存器保存下一条指令的内存地址,CPU使用该信息获取下一条指令。
获取一条指令后,CPU在另一个寄存器中保存该指令并将第一个寄存器的值更新为下一条指令的地址。
CPU只能理解有限的指令(指令集)。
还有,这些指令是想到具体的,其中许多指令要求计算机将一个数从一个位置移动到另一个位置,例如,从内存单元移到寄存器。
1.5高级计算机语言和编译器
采用编译器还有另一个好处。
一般来说,每种计算机在设计上都有其自身特有的机器语言。
所以用机器语言为一个IntelPentiumCPU编写的程序对MotorolaPowerPCCPU来说什么都不是。
但您可以将编译器匹配一种特定的机器语言。
您解决一个编程问题只须一次,然后可以让编译器将该解决方案解释为各种机器语言。
1.6使用C语言的7个步骤
第一步定义程序目标
第二步设计程序
第三步编写代码
第四步编译
编译器是一个程序,其工作是将源代码转换为可执行代码。
可执行代码是用计算机的本机语言或机器语言表示的代码。
这种语言是由数字代码表示的详细指令组成。
不同计算机具有不同的机器语言,C编译器用来将C语言转换成特定的机器语言。
C编译器还从C的库中向最终程序加入代码。
库中包含着许多标准例程供您使用,例如printf()和scanf()。
(更准确地说,是一个被称为链接器(linker)的程序将库例程引入的,但在多数系统上,编译器为您运行链接器。
)最后的结果是,形成一个包含计算机可以理解的代码并且您能够运行的可执行文件。
第五步运行程序
第六步测试和调试程序
第七部维护和修改程序
1.7编程机制
用C语言编写一个程序时,您将编写的内容保存在一个被称为源代码文件的文本文件中。
大多数C系统,包括我们提到的那些,都需要该文件的名称以.c结尾。
该名称还应该满足特定计算机操作系统的需要。
C编程的基本策略是使用程序将源代码文件转换为可执行文件,此文件包含可以运行的机器语言代码。
C分两步完成这一工作:
编译和链接。
编译器将源代码转换为中间代码,链接器将此中间代码与其他代码相结合来生成可执行文件。
C使用被划分为两部分的这一方法使程序便于模块化。
您可以分别编译各个模块,然后使用链接器将编译过的模块结合起来。
这样,如果需要改变一个模块,则不必重新编译所有其他模块。
同时,链接器将您的程序与预编译的库代码结合起来。
中间文件的形式多种选择。
最一般的选择,同时也是我们这里讲述的实现方式所采取的选择,是将源代码转换为机器语言代码,将结果放置在一个目标代码文件(或简称为目标文件)中(这里假定您的源代码由单个文件组成)。
虽然目标文件包含机器语言代码,但该文件还不能运行。
目标文件包含源代码的转换结果,但它还不是一个完整的程序。
目标代码文件中所缺少的第一个元素是一种叫做启动代码(strat-upcode)的东西,此代码相当于您的程序和操作系统之间的接口。
例如,您可以在DOS或Linux下运行一个IBMPC兼容机,在两种情况中硬件是相同的,所以都会使用同样的目标代码,但DOS与Linux要使用不同的启动代码,因为这两种系统处理程序的方式是不同的。
所缺少的第二个元素是库例程的代码。
几乎所有C程序都利用标准C库中所包含的例程(成为函数)。
链接器的作用就是讲这三个元素(目标代码、系统的标准启动代码和库代码)结合在一起,并将它们存放在单个文件,即可执行文件中。
对库代码来说,链接器只从库中提取您所使用的函数所需要的代码。
UNIX下使用cc编译器,Linux下使用gcc,Windows系统下使用集成开发环境。
1.8语言标准
随着C的发展和更加广泛地用于更多种类的系统上,使用C的群体意识到它需要一个更加全面、新颖和严格的标准。
为满足这一要求,美国国家标准化组织(ANSI)在1983年设立了一个委员会(X3J11)以发展一个新的标准,该标准于1989年正式采用。
这个新标准(ANSIC)定义了语言和一个标准C库。
国际标准化组织于1990年采用了一个C标准(ISOC)。
ISOC和ANSIC实质上是同一个标准。
ANSI/ISO标准的最终版本通常被称为C89或C90.然而,因为ANSI版本是首先出现的,所以人们通常使用ANSIC这一术语。
1994年,修订标准的工作开始了,这一努力的结果是产生了C99标准。
一个联合ANSI/ISO委员会(即C9X委员会)签署了C90标准的最初原则,包括保持语言短小而简单。
他们的意图不是为语言添加新的特性,而是为了满足新的目标。
新目标之一是支持国际化编程,例如,提供了处理国际字符集的方法。
第二个目标是“整理现有的惯例以解决明显的缺点”。
因此,在遇到需要将C移植到64位处理器时,委员会根据在真实生活中处理问题的人的经验来添加标准。
第三个目标是针对科学和工程项目的重要数字计算改进C的适应能力。
第二章C语言概述
2.1C语言的一个简单实例
程序中的“\n”和“%d”起什么作用?
2.2实例说明
对程序的分析:
第一遍(快速简介)和第二遍(程序细节)。
通常,C编译器在编译前要对源代码做一些准备工作:
这称为预处理。
在C世界里,人们称出现在文件顶部的信息集合为头(header),C实现通常都带有许多头文件。
最重要的是头文件包括了建立最终的可执行程序时编译器需要用到的信息。
例如,它们可以定义常量,或者说明函数名以及该函数如何使用。
但是函数的实际代码被包含在一个预编译的库文件中,而不是在头文件中。
编译器的链接部分负责找到您所需要的库代码。
简言之,头文件指引编译器把您的程序正确组合在一起。
一、#include指示和头文件
二、main()函数
三、注释
四、花括号、程序体和代码块
五、声明
在C语言中,所有变量都必须在使用之前定义。
折旧意味着您必须提供程序中要用到的所有变量名的列表,并且指出每个变量的数据类型。
声明变量被认为是一个好的编程技术,在C语言中必须这样做。
C语言可以处理多个数据种类(或类型),例如整数、字符和浮点数。
把一个变量声明为整数类型或字符类型是计算机正确地存储、获取和解释该数据的基本前提。
声明变量的四点好处:
把所有变量放在一起,可以让读者更容易掌握程序的内容。
在您开始编写程序之前,考虑一下需要声明的变量会促使您做一些计划工作。
声明变量可以帮助避免程序中出现一类很难发现的细微错误,即变量名的错误拼写。
如果您没有声明所有变量,将不能编译您的C程序。
六、赋值
七、printf()函数
八、return语句
Return语句是程序的最后一个语句。
在intmain(void)中int表示main()函数的返回值应该是一个整数。
C标准要求main()这样做。
带有返回值的C语言函数要使用一个return语句,该语句包括关键字return,后面紧跟着要返回的值,然后是一个分号。
对于main()函数来说,如果您漏掉了return语句,则大多数编译器将对您的疏忽提出警告,但仍将编译该程序。
此时,您可以暂时把main()中的return语句看作是保持逻辑连贯性所需的内容。
但对于某些操作系统(包括DOS和UNIX)而言,它有实际的用途。
2.3一个简单程序的结构
预处理指令+带有参数的函数名+声明语句+赋值语句+函数语句
2.4使程序可读的技能
选择有意义的变量名和使用注释。
使用空行分隔一个函数的概念上的多个部分。
每个语句使用一行。
分号可以告诉编译器一个语句在哪里结束和下一个语句在哪里开始。
2.5更进一步
Printf()的使用括号内第二处输出的值不必是一个变量,它只需结果值具有合适类型的某个式子。
2.6多个函数
C90标准添加了原型,原型是一种声明的形式,用于告诉编译器您正在用一个特殊的函数。
它也指明了函数的属性。
2.7调试
如果不遵循C语言的规则就会犯语法错误。
(拼写错误就不说了)
语义错误。
调试器是一种程序,让您能够一步一步地运行另一个程序并检查该程序的变量值。
不同的调试器具有不同的易用性和复杂度。
较高级的调试器可以显示出正在执行的源代码行。
这对于有多条可选执行路径的程序来说是非常方便的,因为可以很容易知道执行了哪条特殊路径。
如果您的编译器带有调试器,那么现在请花点时间去学会怎么用它。
2.8关键字和保留标识符
如果试图把一个关键词用作变量名,编译器把它作为一个语法错误捕获到。
还有一些您不该用的其他字符,称为保留标识符。
因为它们是合法的名字,所以不引起语法错误。
然而,C语言已使用它们或者保留使用它们的权利,所以如果您用这些标识符表示其他意思就可能引起问题。
保留标识符包括那些以下划线字符开始的标识符和标准库函数的名字。
2.9关键概念
作为程序员,您的工作就是在一个编译器(由C标准指导)能成功处理的框架内表达出您关于程序应采取何种行为的想法。
第三章数据和C
3.1示例程序
交互性方法使程序更为有趣。
3.2变量与常量数据
变量与常量的区别在于,变量的值可以在程序执行过程中变化与指定,而常量则不可以。
3.3数据:
数据类型关键字
对于人,整数和浮点数的区别在于它们的书写。
对于计算机,区别在于它们的存储方式。
浮点数表示法将一个数分为小数部分和指数部分并分别存储。
3.4C数据类型
初始化变量就是为变量赋一个初始值。
C语言中,可以在声明语句中初始化变量,即在变量名后跟上赋值运算符(=)和要赋给变量的值。
声明语句为变量创建、标定存储空间并为其指定初始值。
在C中,由专门的前缀指明哪一种进制。
前缀0x或者0X表示使用十六进制值,所以16用十六进制表示为0x10或0X10.与之类似,前缀0(零)表示使用八进制。
要用八进制而不是十进制显示整数,请用%0代替%d。
要显示十六进制整数,请使用%x。
如果想显示C语言前缀,可以使用说明符%#o、%#x、%#X分别生成0、0x和0X前缀。
C提供3个附属关键字修饰基本的整数类型:
short、long和unsigned。
现在64位处理器,如IBMItanium、AMDOpteron和PowerPCG5正变得越来越普通,需要64位的整数,因而引入longlong类型。
使用printf()语句时,切记每个要显示的值都必须对应自己的格式说明符,并且显示值的类型要同说明符相匹配。
char类型用于存储字母和标点符号之类的字符。
但是在技术实现上char却是整数类型,这是因为char类型实际存储的是整数而不是字符。
为了处理字符,计算机使用一种数字编码。
用特定的整数表示特定的字符。
美国最常用的编码是ASCII码。
标准ASCII码值的范围从0到127,只需7位即可表示。
因为C用值1表示true,用值0表示false,所以_Bool类型实际上也是一种整数类型。
只是原则上它仅仅需要1位来进行存储。
程序使用布尔值来选择执行哪个代码分支。
多数软件开发项目使用各种整数类型就可以工作的很好了。
然而,财务和数学计算程序经常使用的是浮点数。
C语言中浮点数包括float、double和longdouble类型。
很多科学和工程计算需要复数和虚数。
C99标准支持这些类型,但有所保留。
C没有字符串类型,但是它仍然可以很好地处理字符串。
3.8关键概念
C有多种数据类型。
基本的数据类型包含两大类:
整数类型和浮点类型。
第四章字符串和格式化输入/输出
4.1前导程序
4.2字符串简介
字符串就是一个或多个字符的序列。
C没有为字符串定义专门的变量类型,而是把它存储在char数组中。
字符串中的字符存放在相邻的存储单元中,每个字符占用一个单元;而数组由相邻存储单元组成,所以把字符串存储到数组中是很自然的。
使用字符串开始复杂起来了!
必须创建一个数组,把字符串中的字符逐个地放进数组中,还要记着在结尾添加一个\0。
幸运的是,计算机可以自己处理大多数这些细节问题。
strlen()函数以字符为单位给出字符串的长度。
因为一个字符只占用一个字节。
4.3常量和C预处理器
为什么使用符号常量比较好呢?
首先,一个名字比一个数字告诉您的信息多。
而且,架设您在多个地方使用了同一常量,并且必须改变它的值,那么您只需要改变这个符号常量的定义,而不用在程序中查找出现这个常量的每个地方并作修改。
C90新增了一种创建符号常量的第二种方法,即可以使用const关键字把一个变量声明转换成常量声明。
C头文件limits.h和float.h分别提供有关整数类型和浮点类型的大小限制的详细信息。
4.4研究和利用printf()和scanf()
printf()和scanf()函数使您能够与程序通信。
它们被称为输入/输出函数,或者被简称为I/O函数。
它们不是只有您可以使用的CI/O函数,而且是最通用的I/O函数。
4.5关键概念
C的char类型表示一个字符。
要表示一个字符序列,C使用字符串。
字符串的一种形式是字符常量。
其中字符用双引号括起来,例如“Goodluck,myfriend”。
也可以在字符数组中存储一个字符串,字符数组由内存中相邻的字节组成。
字符串,无论是表达成一个字符常量还是存储在一个字符数组中,都要以一个被称为空字符的隐藏字符来结束。
在程序中最好使用#define或是关键字const以符号代表数字常量。
符号常量使程序可读取性更强、更易于维护和修改。
第五章运算符、表达式和语句
5.1循环简介
While循环提供了灵活方便的控制程序的方法。
5.2基本运算符
“数据对象”是泛指数据存储区的术语,数据存储区能用于保存值。
例如,用于保存变量或数组的数据存储区是一个数据对象。
左值右值和操作数。
显然,执行各种操作的顺序很重要,所以C需要关于执行顺序的明确规则。
C通过建立一个运算符的优先顺序来满足上述需求。
许多人喜欢用一种称为“表达式树”(expressiontree)的图表来表示赋值的顺序。
C大约有40个运算符,其中有些运算符比其他运算符要常用得多。
接着介绍4个比较有用的运算符。
Sizeof运算符和size_t类型。
取模运算法%和增量减量运算符++、--。
增量和减量运算符有很高的结合优先级,只有圆括号比它们的优先级高。
赋值语句被许多程序广为使用:
它为一个变量分配一个值。
它的结构是一个变量名,变量后面跟随者一个赋值运算符,赋值运算符后跟着一个表达式,表达式后面跟上一个分号。
注意在while循环语句中包含了一个赋值语句。
赋值语句是表达式语句的特例。
函数语句引起函数的执行。
while语句属于一类有时被称为“结构化语句”的语句,因为它们的结构比一个简单的赋值语句复杂。
复合语句是指使用花括号组织起来的两个或更多的语句:
它也被称为一个代码块。
5.5类型转换
当出现在表达式里是,有符号和无符号的char和short类型都将自动被转换为int,在需要的情况下,将自动被转换为unsignedint(如果short与int有相同的大小,那么unsignedshort比int大;在那种情况下,将把unsignedshort转换为unsignedint)。
在包含两种数据类型的任何运算里,两个值都被转换成两种类型里较高的级别。
类型级别从高到低的顺序是longdouble、double、float、unsignedlonglong、longlong、unsignedlong、long、unsignedint和int。
在赋值语句里,计算机的最后结果被转换成将要被赋予值的那个变量的类型。
当作为函数的参数被传递时,char和short会被转换为int,float会被转换成double。
提升通常是一个平滑的无损害的过程,但是降级可能导致真正的问题。
5.6带有参数的函数
声明一个参数就创建了一个被称为形式参数或形式参量的变量。
C99规定对实际参数或者实际参量使用术语参数,对形式参量或形式参数使用术语参量。
5.8关键概念
运算符与值结合可以产生表达式,并且C的每一个表达式都有一个值。
语句是对计算机的完整指示,在C中通过一个分号来标识。
第六章C控制语句:
循环
伪代码的一个好处是它可以使您专注于程序的逻辑与组织,使您不必同时担心如何用计算机语言来表达您的想法。
伪代码不与某一特定的语言相联系,这样同一伪代码可以被翻译为多种计算机语言。
当您构造一个while循环时,循环中必须包含能改变判断表达式的值来使表达式的值最终变为假。
否则循环永远不会终止(虽然也可以使用break和if语句来终止循环)。
在使用while时要谨记的一点是,只有位于判断条件之后的单个语句(简单语句或复合语句)才是循环的部分,缩进是为了帮助读者而不是计算机。
6.3比较大小:
使用关系运算符和表达式
While语句创建了一个在判断表达式变为假(或零)之前重复执行的循环。
While语句是一个入口条件循环,也就是说,是否执行循环的决定是在进入循环之前就做出的。
因此,循环有可能永远不被执行。
6.4不确定循环与计数循环
有些while循环的例子是不确定循环。
也就是说,在表达式变为假之前您不能预先知道循环要执行多少次。
其他的例子是计数循环,它们循环执行预先确定的次数。
6.5for循环
for循环把所有这三种动作(初始化、测试、更新)都放在一起。
for循环的第一行告诉我们关于循环参数的所有信息:
num的初始值,num的最终值以及num在每次循环的增量。
6.6更多赋值运算符:
+=、-=、*=、%=
C有多个赋值运算符。
最基本的一个当然是=,它简单地把其右边表达式的值赋给左边的变量。
其他赋值运算符对变量进行更新,每个这样的赋值运算符在使用时都是左边为变量名,右边为一个表达式。
变量被赋予一个新的值,这个新值是它原来的值根据右边表达式的值进行调整得到的。
确切的调整方式要依赖于运算符。
6.7逗号运算符
逗号运算符扩展了for循环的灵活性,因为它使您可以在一个for循环中使用多个初始化或更新表达式。
6.8退出条件循环:
dowhile
while循环和for循环都是入口条件循环,在每次执行循环之前先检查判断条件,这样循环中的语句就有可能一次也不执行。
C也有退出条件循环,判断条件在执行循环之后进行检查,这样就可以保证循环体中的语句至少被执行一次,这被称为dowhile循环。
6.9选择哪种循环
当您确定需要循环时,应该使用哪一种呢?
首先要确定您需要入口入口条件循环还是退出条件循环。
通常是需要入口条件循环。
有若干原因使得计算机科学家认为入口条件循环更好一些。
首先是因为一本原则是在跳过(或循环)之前进行查看要比之后好;其次是如果在循环开始的地方进行循环判断,程序的可读性更强;最后一点是在很多应用中,如果一开始就不满足判断条件,那么跳过整个循环是重要的。
6.10嵌套循环
嵌套循环是指在另一个循环之内的循环。
通常使用嵌套循环来按行按列显示数据。
也就是说一个循环处理一行中的所有行,而另一个循环则处理所有的行。
6.11数组
一个数组就是线性存储的一系列相同类型的值,例如10个字符或15个整数。
整个数组有一个单一的名字,单独的项或元素可以使用一个整数索引来进行访问。
6.12使用函数返回值的循环
写一个具有返回值的函数要做以下事情:
1、当定义函数时,说明它的返回值类型;
2、使用关键词return指示要返回的值。
6.13关键概念
C通过数值计算来处理判断条件。
结果为0表示假,任何其他值都是真。
数组由相同类型的邻近的内存位置组成。
您需要谨记数组元素是从0开始编号的,这样最后一个元素的下标就比元素的个数少1。
C并不检查您是否使用了合法的下标值,所以这需要由您自己来负责。
第七章C控制语句:
分支和跳转
7.1if语句
if语句被称为分支语句或选择语句,因为它提供了一个交汇点,在此程序需要选择两条分支中的一条前进。
这种结构和while语句很相似。
主要的区别在于在if语句中,判断和执行(如果可能的话)仅有一次,而在while循环中,判断和执行可以重复多次。
7.2在if语句中加入else关键字
C还可以通过使用ifelse形式来在两个语句间做出选择。
日常生活经常会给我们提供两个以上的选择。
可以用elseif扩展ifelse结构来适应这种情况。
如果没有花括号指明,else与和它最接近的一个if相匹配。
从技术角度来讲,ifelse语句作为单个语句,所以不需要括上花括号。
外部if也是单个语句,所以也不需要花括号。
然而,当语句很长时,花括号使人更容易清楚发生了什么,并且当后来将其他语句加到if或循环中时它们提供了保护。
7.3获得逻辑性
!
运算符的优先级很高。
它高于乘法运算,和增量运算符的优先级相同,
逻辑表达式是从左到右求值的。
一旦发现有使表达式为假的因素,立即停止求值。
7.5条件运算符?
:
C提供一种简写方式来表示ifelse语句的一种形式。
这被称为条件表达式,并使用条件运算符(?
:
)。
这是个有三个操作数的分两部分的运算符。
7.6循环辅助手段:
continue和break
一般来说,进入循环体以后,在下次循环判断之前程序执行循环体中所有的语句。
continue和break语句使您可以根据循环体内进行的判断结果来忽略部分循环甚至终止它。
循环中的break语句导致程序终止包含它的循环,并进行程序的下一阶段。
7.7多重选择:
switch和break
break语句用于循环和switch中,而continue仅用于循环。
但是,如果switch语句位于一个循环
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- Primer Plus第五版学习笔记 Plus 第五 学习 笔记