




版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
1、第1章 C+语言基础 C+是一种以C语言为基础开发的高级语言,一般认为C是C+的一个子集或基础语言,但二者又是完全独立的。 C+适合大型程序的开发与设计 C则适合于更底层的项目开发1.1 C+语言概述1.1.1 标准C+ C+发明者:Bell实验室Bjarne Stroustrup博士 C+第一定义:“带类的C” C+保留了C作为一个子集 C+从Simula语言引入了类的概念,包括派生类和虚函数;借鉴了Algol语言的运算符重载等特性。1.1.1 标准C+(续) 起初,C+编译系统只是一个预编译系统。 1988年,出现一个真正的C+编译系统。 1998年,ISO/ANSI C+标准正式通过并发
2、布。 总体上,C+是一种混合语言,是集过程化设计、面向对象、基于对象和泛型算法等多种技术于一体的编程语言。 学习C+最重要的是集中关注概念,不要迷失在语言的技术细节中。1.1.2 C+语言的简单程序#include using namespace std;int main( )int x = 10, y = 20;int z = x+y;cout “sum is ” z endl;return 0;输出结果:sum is 301.1.2 C+语言的简单程序(续) 1 main函数与程序结构 一个完整的程序有且只能有一个main()主函数或入口函数 标准C+要求main函数的声明类型为int,只
3、要在末尾加上return 0;1.1.2 C+语言的简单程序(续) C+的程序结构 预处理命令部分 函数声明部分 类型定义部分 main函数定义 其它函数定义 函数由函数体构成,一般包括变量定义、输入、运算和输出等内容。1.1.2 C+语言的简单程序(续) 2 头文件包含与名字空间 固定写法: #include /头文件包含 using namespace std; /名字空间声明 可以将一个名字空间理解成包含若干定义的一个区域的名字。 标准C+所有定义都属于名字空间std。1.1.2 C+语言的简单程序(续) 3 注释 +的“块注释”:*和*为分界符号,与中的用法一致。 +的“行注释”:以/
4、符号开始到一行的结束。 使用注释符时的注意事项: 标志符/和*,/和/之间不可以分开。 注释符对“/*”和“*/”不可以嵌套。 注释符/之后的注释结束于本行。 /和/*与*/可以嵌套使用。1.1.2 C+语言的简单程序(续) 思考题:下列程序是否正确?#include using namespace std;int main() /*下面程序将在终端上输出/*你好*/的字样*/cout “你好!” endl;/*/输出字符*/return 0 ;/*/正常返回1.1.2 C+语言的简单程序(续) 4 输入输出对象 使用I/O流必须要包含“iostream”头文件。“#include ”告诉C+
5、编译器,将文件iostream内容插到此程序中。 iostream中定义了一组标准类输入输出流(I/O stream)类。 流八位的字节序列。 cout是标准输出流类的一个预定义的对象,代表控制台输出设备(console out)如:显示器。 cin是cout的反义词,控制台输入,如键盘。1.1.2 C+语言的简单程序(续) cin与cout说明 用来取代scanf和printf,更安全、更方便。1 格式控制符与输出数据的类型不一致2 scanf()的第二个参数应是一个指针参数,以上错误C编译器不能检查出来。#includevoid main() int i; float f; scanf(“
6、%f”,i); printf(“%d”,f);#includeusing namespace std;void main() int i; float f; cini; cout”在C+中仍保持C中“右移”功能,但用于输入时扩充了其功能,表示将从标准输入流(键盘)读取的数值传送给右方指定的变量。 如:cinx; /键盘输入的数据自动转换为变量X的类型,并存入变量X内。 可以连续输,如cinabc;不用顾忌类型。 它按书写顺序从键盘上提取所要求的数据,并存入对应的变量中。 用cin输入时,要注意使用间隔符 (空格、回车、Tab键)。1.1.2 C+语言的简单程序(续) cout中运算符“”在C+
7、中保持C中“左移”功能,表示将右方变量的值写到标准输出流cout(即屏幕)中。 “”允许用户连续输出一串数据或表达式。 可以使用格式控制(与C兼容),默认的转换基数是十进制。 如:dec(十进制), hex(十六进制), oct(八进制), endl, t, n等。1.1.2 C+语言的简单程序(续) C中换行用n; C+中换行用endl; 如:coutxendl; coutyn;等价于printf(“%dn”,x);#include using namespace std; void main() int x=25; couthexxdecxoctxn;输出结果:19 25 311.1.2
8、C+语言的简单程序(续) 5 灵活的局部变量声明下面局部变量声明是否正确?为什么?f ( ) int i; i=10; int j; j=25; /1.1.2 C+语言的简单程序(续) 6 编码习惯 尽量保持好的书写风格是必须养成的习惯。 要注意程序的书写格式,如缩进格式和成对符号的对齐排列等。1.2 面向对象的程序设计思想 C向C+过渡的实质是由过程化程序设计思想向面向对象程序设计的思想的转变。程序设计语言的发展 硬件发展软件危机结构化程序设计软件工程面向对象技术 机器码低级高级;1.2.1 过程化的程序设计 面向过程编程 它是早期的程序设计范型,它考察整个设计过程,以功能分解为中心。 面向
9、过程的特征 早期程序设计者认为: 程序 = 数据结构 + 算法 这个公式贯穿于整个程序设计的始终,无论程序是系统程序还是模块程序。1.2.1 过程化的程序设计(续) 过程化的问题处理思路形成了一套有效的程序设计方法,称为结构化方法。 程序设计采用自顶向下,逐步细分的方法展开。 模块化 使用三种基本控制结构:顺序、选择、循环。 三种结构的共同点:每种结构只有一个入口和一个出口。1.2.1 过程化的程序设计(续) 过程化方法应用举例:int main( )开始函数();绘制画面函数(初始棋局);重复下述步骤 走棋函数(黑子); 如果(判断输赢(棋局)已定出输赢)停止重复;走棋函数(白子);绘制画面
10、函数(棋局);如果(判断输赢(棋局)已定出输赢)停止重复;输出结果函数(棋局);结束函数();1.2.1 过程化的程序设计(续) 面向过程的不足 强调功能分解,为了实现功能,有时数据结构屈从于算法,结果造成数据结构和过程的分离。 由于过程化设计中的数据与过程是相互独立的,一个过程完全可以作用到并不相关的数据上,也不能保证对数据操作的合理性,数据对于算法完全是被动的。 此种操作是一种“谓语宾语”结构。 对于庞大、复杂的程序难以开发和维护1.2.2 面向对象的程序设计 面向对象编程 是一种以对象为中心的程序设计范型。也可以说是一套概念和想法,它与面向过程程序设计相对应,是一种用计算机程序来描述实际
11、问题的思路。 面向对象的特征 OO(Object-Oriented)程序设计者认为: 程序 = 对象 + 消息 这个公式表明面向对象的程序以对象为程序组成单位,以消息为动力(驱动)。1.2.2 面向对象的程序设计(续) 面向对象方法应用举例:int main()定义对象,包括黑棋选手,白棋选手,裁判,组织者;裁判确定比赛开始();组织者绘制画面();重复下述步骤 黑棋选手.走棋();如果(裁判.判断输赢()已定出输赢)停止重复;白棋选手.走棋();组织者.绘制画面();如果(裁判.判断输赢()已定出输赢)停止重复;组织者.输出结果();裁判.确定比赛结束();1.2.2 面向对象的程序设计(续
12、) 面向对象的好处 以对象为单位组织程序,更接近人思维方式,OO借鉴了认知论的观点。 不同对象各司其职,对象自身行为的实现方式的改变不会影响到其它对象,对象间通过互通消息实现合作。 从实现上看,对象的每次操作都是在该对象接收到一定消息后的自主行为(用“对象.函数名”形式表示),具有“主语谓语”的形式。1.2.2 面向对象的程序设计(续) 面向对象和面向过程 两者不是对立的,面向对象是面向过程发展到一定阶段的产物,是程序设计的高级阶段,面向对象以面向过程为基础。 二者的适合情况 对于一些简单的问题,基于过程的解决方法是十分有效的。 对于大型、复杂的系统,采用面向对象的方法更能显示出优势,有利于利
13、用对象构成软件“积木插件”,进而在一定的程度上解决软件重用的难题。1.3 面向对象程序设计的主要特点 面向对象系统最突出的特征 封装性、继承性、多态性(三个特性) 封装的概念和数据抽象(类)密切相关 现实中的例子 人们使用录音机,只要知道键的功能即可(放音、录音、停止、倒带等),不需要知道这些功能是如何实现的,也不需要知道其内部电路或构造。1.3 面向对象程序设计的主要特点(续) 1 类与封装 类的概念 类是一组具有相同属性和行为特征的对象的抽象描述。 类和对象的关系 抽象和具体的关系,类是多个对象的归纳和总结(分类的结果),对象又是类的个体实物,一个对象就是类的一个实例。1.3 面向对象程序
14、设计的主要特点(续) 类和对象类型和变量 类和对象实际上就是C的数据类型和变量,只不过在C+中,统称为类和对象。 对象的状态 类没有具体的值,对象才有,对象的这些具体的值称为对象的状态。类 对象实例化声明1.3 面向对象程序设计的主要特点(续) 对象状态举例: Teacher LiMing; LiMing.age = 30;LiMing.degree = “doctor”;LiMing.title = “professor”;名称名称LiMingage30degreedoctortitleprofessor1.3 面向对象程序设计的主要特点(续) 类的结构 类的结构和对象的组成是严格对应的!
15、类中的成分有两种:数据成员和成员函数。类数据成员对应对象的属性,也叫做成员变量。成员函数对应对象的方法,是类功能的载体。1.3 面向对象程序设计的主要特点(续) 类的结构实例 数据成员 成员函数class Teacher int age; char* degree; char* title;public: void Study( ); void Teach( ); int TellAge( );;1.3 面向对象程序设计的主要特点(续) *类和对象的作用周期 类只在源程序的代码中出现,它是编译器生成对象的说明书,并不会在运行的程序中出现 ,即类只在编译时存在; 对象作为类的实例是在运行的程序中
16、出现,并占有内存空间,它是程序运行时存在的实体,是机器指令操作的内容。1.3 面向对象程序设计的主要特点(续) 对象的特性 对象是面向对象程序设计的最重要的细胞和基石,它有如下的特性: 1 封装性隐藏内部细节 2 模块独立性实体的抽象(类) 3 动态连接性消息机制 4 易维护性更新在边界内1.3 面向对象程序设计的主要特点(续) 对象的交互 现实世界的对象并非孤立的实体,它们间存在着联系,从而构成不同的系统。 面向对象程序设计中,对象之间的联系我们称之为对象的交互。 对象交互的实现 在OOP中,对象交互的实现要用到一个重要的工具:消息。1.3 面向对象程序设计的主要特点(续) 对象交互图示 消
17、息 对象的交互中介(请求或通知) 消息传递 面向对象的程序设计中对象协作机制对象1对象2消息1.3 面向对象程序设计的主要特点(续) 消息传递与调用 实际上,对象的消息传递对应于程序设计中的过程(函数)调用。 比如:键盘对象的按键消息传给显示对象 消息的发送和接收 发送消息的对象为发送者或请求者,接收消息的目标对象为接收者或服务者(有处理消息的能力)。1.3 面向对象程序设计的主要特点(续) 消息的处理简单模型 消息的处理就是过程(函数)的执行。 某过程 Teacher t; / t.Study(实参);/return 0; ; 代码后半部分消息传递给消息传递给t代码前半部分某过程代码在中对象
18、t的内容 /执行代码Study(参数)1.3 面向对象程序设计的主要特点(续) 消息的内容组成 包含有接收者的名字,请求的方法,一个或多个参数。 消息机制可以扩充的很复杂 消息的性质 1、一消息可以发给多个对象 2、一对象可以接受多个消息 3、对象可以响应消息,也可不响应1.3 面向对象程序设计的主要特点(续) 2 继承 类间的承袭关系 继承所表达的是对象类之间的相互关系,这种关系让某类对象可以使用另外一类对象的特征和能力。父母孩子继承1.3 面向对象程序设计的主要特点(续) 继承类之间的几个特性 1 类间具有共享的特征(数据和代码共享) 2 类间具有差别和新增部分(非共享内容) 3 类间具有
19、层次结构 假如有类B继承类A,则类B 的对象具有类A的一切特征, 此时,类A为基类或父类或 超类,类B为派生类或子类基类派生类继承1.3 面向对象程序设计的主要特点(续) 继承机制的优点 1 代码重用,避免重复开发 2 增强一致性,统一的处理接口和界面 3 代码进化,高效的扩充功能 为程序员提供了一种组织、构造和重用类的方法。1.3 面向对象程序设计的主要特点(续) 继承的分类 从继承源上分,继承分为单继承和多继承窗口对话框玩具车玩具车 单继承 多继承1.3 面向对象程序设计的主要特点(续) 继承的分类 从继承内容上分,继承分为取代继承、包含继承 、受限继承和特化继承 1 取代继承子类覆盖了父
20、类的内容 2 包含继承子类含有父类(的内容) 3 受限继承子类退化父类的内容 4 特化继承子类比父类有更多内容1.3 面向对象程序设计的主要特点(续) 继承与封装的关系封装是继承的基础;继承是封装的发展,是为了更好的、更大规模的封装。 继承和封装的相似性它们都提供了共享代码的手段:都是通过this指针来完成程序运行时的代码共享。1.3 面向对象程序设计的主要特点(续) 3 多态 面向对象系统中,不同的对象收到相同的消息时产生多种不同行为方式的现象。 C+语言支持两种多态性编译时多态性和运行时多态性C+中,编译时多态是通过重载实现的,而运行时多态是通过虚函数实现的。1.3 面向对象程序设计的主要
21、特点(续) 重载的概念 重载是指用一个标志符(符号)来实现多个功能或行为的现象。 重载包括函数重载和运算符重载 函数重载 使用同一个名字的多个函数定义。 运算符重载 符号使用的重新定义。实质同函数重载。1.3 面向对象程序设计的主要特点(续) 重载的目的 更好地表达行为共享,重载的函数或运算符一般都具有相似的操作。 重载的直接益处 减少了程序员的记忆负担。 例如:print(char*); print(“Hello”); print(int); print(50);1.3 面向对象程序设计的主要特点(续) 面向对象语言应该具有下述特征: 支持类和对象(包括特性,如封装等) 提供类间的继承机制
22、支持多态(重载机制) 上述实际上就是面向对象系统的三大特性。1.4 C+集成化开发环境 C+ Builder 6.0 Visual C+6.0第1章 结束第2章 基本数据与操作 程序需要用约定的字符集来描述,C+语言基本上采用ASCII码中的可见字符构成字符集。2.1 标识符与关键字2.1.1 标识符 标识符是由程序员为程序中的各种成分:变量,有名常量,用户定义的类型,枚举类型的值,函数及其参数,类,对象等所起的名字。 标识符的组成规则: 标识符是一个以字母或下横线_开头的,由字母、数字、下横线组成的字符串. 如:abcd,c5,_PERSON_H 都是合法的标识符,而3A,A*B,43.5A
23、 都是不合法的,一个标识符中间不可插入空格。2.1.1 标识符 标识符应与任一关键字有区别,如for,if, case 等都不可作标识符。 标识符中字母区分大小写。如ABC与abc,被认为是不同的两个标识符。而关键字是否区分大小写,取决于不同系统定义。 标识符具有有效长度,(一般32位)在软件工程中,提倡使用“匈牙利标记法” 为变量起名。 尽量不要使用下划线开头的标识符,以免与系统中预先定义的一些标识符冲突。2.1.2 关键字 关键字是这样一类有特定的专门含义的单词。对于C+ 语言来说,凡是列入关键字表的单词,一律不得移作它用。因此,关键字又称为保留字(reserved word)。 例如在上
24、节的程序中,void,int,for,if 等单词就属于关键字。2.1.2 关键字 关键字表 课本p17 关于C+语言的关键字,有如下说明: C+ 语言的关键字一般包含了几乎所有的C 语言的关键字。 随着C+语言的不断完善,其关键字集也在不断变化。 各不同版本的C+ 语言的实现可能有不少涉及其应用领域的关键字的设置. 总之,关键字集合是使用C+语言编程前应首先弄清楚的,特别是对少数个别的关键字的设置应有所了解,以免在编程中产生错误,至少应避免在设定标识符时与关键字重名。2.1.3 基本数据类型 C+是一门强数据类型的语言,每一种数据一般都严格地对应确定的数据类型。 C+的数据类型有基本数据类型
25、和非基本数据类型之分。 基本数据类型是C+内部预先定义的数据类型,非基本数据类型包括指针、数组和结构以及类类型等,非基本数据类型也称用户引入的数据类型。 类型名类型名type 说明说明长度长度 数据范围数据范围 bool布尔逻辑型布尔逻辑型 1 true (1) false(0) char字符型字符型 l -128127 (0255) unsigned char无符号字符型无符号字符型 1 0255 signed char有符号字符型有符号字符型 1 -128127signed short int有符号短整型有符号短整型 2-3276832767unsigned short int无符号短整型
26、无符号短整型 2065535signed int有符号整型有符号整型2/4-3276832767 unsigned int无符号整型无符号整型 2 /4 065535 signed long int有符号长整型有符号长整型 4 -21474836482147483647 unsigned long int无符号长型型无符号长型型 4 04294967295 float浮点型浮点型 4 3.4*10e-383.4*10e38 double双精度型双精度型 8 1.7*10e-3081.7*10e308long double长双精度型长双精度型8/ 10至少与至少与double类型同类型同2.2
27、常量与变量 C+程序中的常量是指固定不变的量。一般常量有两种表示形式:一种称为直接常量,一种称为符号常量。例如圆周率pai=3.1416,其中pai就是一个符号常量,pai是量3.1416的名字,而3.1416 称为直接常量。 C+程序中符号常量的名字就是一个标识符,而直接常量是一类特殊的单词,它也是程序所要处理的数据的值。 直接常量分为四类:整型常量,浮点型常量,字符型常量和字符串常量。2.2.1 整型常量 整型常量即int型常量,实际上就是整数。C+程序中除允许一般的十进制整数之外,还允许八进制整数和十六进制整数出现。 例如:cout023“ ”23“ ”0 x23; 将输出不同的十进整数
28、:19,23,35。 2.2.2 浮点型常量 也称为实型常量,是指数据是以浮点方式存储的。 小数点表示法:4.75,2.0 科学表示法:1.2e4 ,-7.37e-3 浮点常量是double类型的常数。2.2.3 字符型常量与字符串常量 1 字符型常量 用单引号 括起来的一个字符构成了一个字符常量。 字符型常量是char类型的常数。字符型数据总是占用一个字节并以定点方式存储该字符的ASCII值,因此字符可以被用于描述小的整型数。 表现形式有: 字符形式 转义字符 cout“hellonTom”; 十六进制的转义字符 如A的ASCII值为65,若转换为十六进制为x41 八进制的转义字符 如:!的
29、ASCII值为33,可用41表示。2.2.3 字符型常量与字符串常量(续) 2 字符串常量 用双引号“ ”括起来的字符序列构成了一个字符串常量。如:“hello worldn”。 一个字符串占用的字节数等于它所包含的字符个数加1,对应于每个字符的字节中存放该字符的ASCII值,而多余的一个字节存放0。表示字符串结束。 注意 : A与“A”的区别。 与“”的区别。2.2.4 符号常量 1 宏定义 由C语言延续下来的符号常量表示方法是宏定义。 如:#define PI 3.14 由于宏不能体现数据类型,在一些特殊情况下可能带来难以察觉的错误,因此,C+建议用const类型的常量替代它。2.2.4
30、符号常量(续) 2 用const定义常量 语法格式 const type 常量名(值) const type 常量名 = 值 定义中的type可以是任何一种内置类型或自定义类型,省略时表示int类型。 优点:增加了数据类型,使得编译器能够实现对类型的核查以消除潜在的错误隐患。2.2.4 符号常量(续) 3 使用enum定义的枚举常量 描述一组相关的状态或属性。如若干种颜色等。 格式:enum 枚举类型名 枚举值列表 ; 如:enum Week Sun, Mon, Tues, Sat ; 使用:Week aday = Wed ;/aday的值只能是SunSat之一。 第1个枚举元素值默认为0,其
31、他值依次递增。也可以指定枚举元素的值。 标准C+对枚举类型的限制比较严格,如不允许枚举类型的变量进行增减运算等。2.2.5 变量 变量定义隐含内容 系统在内存中分配一块存储区 用变量名表示存储在此内存区中的值 基本形式 type 变量名(初始值); type 变量名 = 初始值 ; 定义变量时最好为变量提供初始值,否则,变量的值是难以预料的。2.3 简单运算 运算符和表达式 算术运算 赋值类运算 自加和自减运算 关系运算和逻辑运算 位运算 sizeof运算与逗号运算2.3.1 运算符和表达式 运算符的使用含义是由系统预定义好的(注意,C+允许用户重定义即重载运算符,从而使它们对某些用户自定义类
32、对象可具有另外的用户自定义运算符含义)。通常情况下,运算符所操作的运算对象均为基本数据类型(或其简单派生类型)的具体数据。 通过运算符把运算对象(常量或变量)按照一定的规则连接起来就构成了表达式。表达式的运算结果是一个“值”(它将隶属于与运算对象相关的某种数据类型)。表达式的求值顺序取决于表达式中那些运算符的优先级以及结合性。 通常,表达式计算后的结果被存储在寄存器中,如果不保存到某个变量中就会被随后的运算“冲掉”。 由于表达式值本身不是保存在内存中,也就不能代表内存变量。 特殊情况下除外。见P232.3.2 算术运算 算术运算包括:单目的单减(-)、增量(+)和减量(-)运算,以及双目的加(
33、+)、减(-)、乘(*)、除(/)和模(%)运算。 1. 单目的单减(-) 使用格式: - 使用含义: 相当于用-1乘上运算分量也即随后所跟的的值。 例如:-x, -(a+b-2*c), -sqrt(a*a+b+b) 2. 单目的增量(+)和减量(-)运算 增量(+)的使用格式: 前缀增量:+ 后缀增量:+其中的“”必须为int型(包括char型)变量。 增量(+)使用含义:令作为运算分量的那一变量值加1。 前缀增量+i与后缀增量i+的区别在于:如果+i与i+又作为分量参加其他运算的话,前者是先令i加1然后参加其他运算;而后者则先令i参加其他运算,而后再令i加1。 x=i+; /结果等价于 x
34、=i; i=i+1; x=+i; /结果等价于 i=i+1; x=i; 减量(-)的使用格式: 除将加法改为减法外,减量运算与上述的增量运算完全相同。1. void getn(int * n) 2. 3. while(*n)-);4. 5. void main( )6. 7. int a = 12;8. getn(&a);9. couta+endl;10. 3. 双目的加(+)、减(-)、乘(*)、除(/)和模(%)运算 使用格式: 使用含义: 相当于进行数学中的加(+)、减(-)、乘(*)、除(/)和取模(%)运算。 例如: x+y, x-y, x*y, x/y, x%y。需要注意以下几点:
35、 1、做除法运算时,若参加运算的两个对象都为int类型时,则运算结果(即商)仍为int型数据(甩掉商的小数部分而取整)。如,7/3的结果为2,而7/4的结果则为1。 2、取模运算符主要用于整型数值计算。x%y是要求出x除以y所得的余数。如,7%3的结果为1,而7%4的结果则为3。注意,x%y的值总等于x-y*(x/y)的值。需要注意以下几点: 3、若参加运算的两个分量的类型不同时,系统会自动将“短”类型数据转换为等值的“长”类型数据而后再进行运算,而运算结果规定为“长”类型数据。所谓“短”类型数据是指该类型的数据占据的内存空间少而且所表示数据大小的范围也要小。 如,char比int要“短”,而
36、int又比float“短”等等。 如:5/2为2, 而5/2.0则为2.5。这是因为int型的5与float型的2.0进行运算时, 系统会自动将int型的5转换为等值的float型的5.0后再进行运算, 因而结果也必然为float型的2.5了。2.3.3 赋值类运算 1 赋值运算 是一个双目运算符 2 自反的赋值运算 + =、- =、 如:x + = 3 与 x = x + 3 3 赋值表达式 x1=(x2=3)+2 /相当于x2=3; x1=x2+32.3.4 关系运算和逻辑运算 1 逻辑值 C+语言中增加了逻辑类型bool,其值可以是true或false,但本质上它是一种用整数描述的量,值
37、为1和0。 例如: bool flag = true ; flag = flag -1 ; flag = flag 1 ) ;2.3.4 关系运算和逻辑运算(续) 2 关系运算 C+语言提供了6种关系运算符:、=、=、=、!=。 表达式 a = c 等价于(a = c )。 一个关系表达式的值只能是true 或 false。2.3.4 关系运算和逻辑运算(续) 3 逻辑运算 C+提供了三种逻辑运算,相应的逻辑运算符为: !, &, | (分别称为逻辑非, 逻辑与, 逻辑或运算)。 如:!true , (31)&(24) , (2.53)|false C+允许其它类型的数据(整型、浮点型或字符等
38、)作为逻辑运算符的操作数。 如:2( x- 3.0 ) x = 0 ( 或! x ) x != 0 ( 或 x ) 3=x=6 改成 3=x & x =6 2.3.5 位运算 1 位运算的规则 C+提供如下6个位运算符:(单目, 按位求反)、&(双目, 按位与)、|(双目, 按位或)、(双目, 按位异或)、(双目, 按位右移)。见例P28。2.3.5 位运算(续) 2 位运算的特殊用途 运算可以将一个数中的某些位清0。 运算可将一个数中的某些位置1。 异或运算可以方便地使一个数据的某些位“翻转”。“XOR”应用举例:用于屏幕颜色的擦除。已知屏幕上某点的颜色值为x,为了改变其颜色,可以用一种新的
39、颜色如y与其“XOR”,结果为xy。若要还原成x(相当于擦除操作),可以用y与其再进行“XOR”运算,结果为(xy)y=x(yy)=x0=x。这就恢复了原来的颜色x。Windows的绘图程序中用鼠标拉动画直线、用鼠标拖运窗口以及一些动画软件中都采用了这种技术。2.3.6 sizeof运算与逗号运算 sizeof是系统的关键字同时又作为常用的运算符。 sizeof运算符用于确定数据占有的内存空间大小,返回一个表达式或某一数据类型的字节数。它主要有两种语法格式: sizeof (e) 或者 sizeof e sizeof (type) type 是定义变量的数据类型, e是表达式。 类型type格
40、式必须放在括号中,表达式可以不用括号。 sizeof 运算符的操作数既可以是内置数据类型,也可以是用户引入的数据类型或结构变量。2.3.7 sizeof运算与逗号运算(续) sizeof在编译阶段就完成了计算处理,其结果作为无符号int常数。因而操作数实质上包含数据所占内存的静态大小。下面是32位模式下的输出结果: sizeof (1.0f) = sizeof ( float) = 4, sizeof (1.0) = sizeof ( double ) = 8 sizeof 1 = sizeof(char)=1, sizeof 1 = sizeof ( int ) = 4 sizeof (x6
41、D) = 1, sizeof (0 x6D) = 4。 sizeof (12) = 3 逗号运算符是一个双目运算符,见P29。2.4 混合运算与类型转换 隐式转换 显式类型转换2.4.1 隐式转换 在运算符本身没有特殊要求情况下,整型、实型和字符型数据间可以进行混合运算。此时,系统会将参加运算的操作数类型转换一致后再进行运算,称为隐式类型转换。 类型转换中,以“数据升格”方式进行。 相同类型的数据由短数据转换成长数据,定点数转换为浮点数,有符号数转换为无符号数。 (低)charunsigned charintunsignedlongunsigned longfloatdouble(高) 如A/
42、2 和 3.0/2 分别转换为65/2 和 3.0/2.02.4.2 显式类型转换 1 来自C语言的类型转换运算符 语法形式: (type) (expression) 举例:int x(3) , y(2) ;cout x/y ; double (x) /y;结果是什么?2.4.2 显式类型转换(续) 2 造型(cast) 标准C+提供了称为造型的4种类型转换符。 static_cast、dynamic_cast、const_cast和reinterpret_cast 语法形式:X_cast (expression)2.4.2 显式类型转换(续)1、const_cast 主要用于const常量向
43、非常量的类型转换 如:const int x (1); int* px=const_cast(&x); 其中const_cast就是去掉常量指针x的const属性。 不经过转换时,常量的地址不能赋值给普通的指针变量。 这样的转换并不常见,常常是因为设计不合理所致。 2.4.2 显式类型转换(续)2、static_cast 与C语言类型转换运算符(type)作用基本相同,在编译时完成,属于静态转换。如: int x = static_cast(3.8); /x 的值为3 可以用static_cast将void*类型的指针转换为其它类型的指针,如: int y = 2; void* vptr =
44、&y; double* ptr = static_cast(vptr); 由于类型不相容,不同类型的指针之间不能直接转换,如: double* ptr = static_cast(&y); /错误的转换 可见,由于在程序编译时进行类型匹配检查,使用static_cast比来自C语言的类型转换符更安全 2.4.2 显式类型转换(续)3、reinterpret_cast reinterpret_cast的作用和功能与旧式的(type)运算符完全相同。 int y = 2; double* ptr = reinterpret_cast(&y); reinterpret_cast的类型转换几乎是没有任
45、何“障碍”的,也是最危险的。2.5 数据输入与输出 C和C+都属于内核很小的语言,本身没有输入输出语句,所有的输入和输出工作都由预定义的库函数或对象来完成。 基本的输入和输出操作由头文件中定义的两个对象cin和cout完成。 cin和cout具有数据类型的自动识别功能,对于所有内置的简单类型,不需要用户的任何设置,即可实现对数据的正确输入与输出。2.5 数据输入与输出(续) 1 cout与数据输出 预定义常量endl,表示光标换行,效果与n等同。 2 cin与数据输入 使用cin可以连续输入多个变量的值。 如果连续输入的数据是整数或实数,采用空格或回车分隔。 如果连续输入整数(或实数)和字符(
46、或字符串),应采用回车分隔。第2章 结束第3章 语句与流程控制 C+中的语句主要由定义语句、声明语句、表达式语句和流程控制语句组成,任何语句必须以分号结束。 如:3.1 语句int x(10);class Point.;void func(int);extern int x;注意:变量定义和声明是不同的,定义涉及到空间的分配和初始化,但声明只是说明变量的特征。 3.1 语句(续) 简单语句 x = 12;/赋值语句 x+;/一般表达式语句 func(x);/函数调用语句 复合语句 有时,语法上要求在某个结构中只能使用一个语句,而实际上又应该使用多个语句。为此,可以将多个语句放在一对尖括号“ ”
47、里,构成一个复合语句。 3.1 语句(续) 例:if(x0) y = 10;/此处语法要求只能有一个语句 func(x); /不组成复合语句语法上出错else y = 2; 复合语句也被称为“块”或“分程序结构”,其后不必再用分号结束。3.2 选择结构 也称分支结构,这种结构根据条件是否满足决定程序执行的路线(流程)。 有三种与选择有关的结构,包括条件运算、if语句和switch语句。 3.2.1 条件运算符和条件表达式 条件运算符是C+中唯一的一个三目运算符,由?和:两个字符组成,形式如下: e1?e2:e3(e1表示一个逻辑判定 ) 作用:应付简单的逻辑关系。可以使程序简单!可以替换简单的
48、条件语句!例2:下述代码从键盘接收一个字符并进行判断,再转换为对应的小写字母输出。char cx;cin cx;cout (A=cx & cx x;cout 0 ? x : -x);3.2.2 if语句两种基本结构:A. if(表达式) 语句B. if(表达式) 语句else 语句例:if(ab) cout a;cout y) if(ab) cout x , a; else cout y , b;例如,对于如下的数学关系:)(1) 1(0)0(2)3(1其它xxxxyif(x = = -3)y = -1;elseif(x = = 0) y = 2; else if(x = = 1) y = 0
49、; else y = 1;cout ”y=” y endl; 3.2.3 switch语句 switch语句常称为开关语句,是专门用于处理多分支情况的语句,一般形式如下: switch(expression) case 常量表达式1: statements_1 break; case 常量表达式2: statements_2 break; case 常量表达式n: statements_n break; default: statements_n+1switch语句的主要限制是expression必须是整数(准确地说是定点数,包括字符和枚举). 例如,points代表一个学生的成绩,可用如下的
50、switch语句计算等级(A、B、C、D、E):#includeusing namespace std;void main( ) double points; char grade; cin points; switch(int(points/10) case 9: /90=points100 case 10: grade = A; break;/points=100 case 8: grade = B; break;/80=points90 case 7: grade = C; break;/70=points80 case 6: grade = D; break;/60=points70
51、default: grade = E;/points60 cout grade is grade endl;认真理解switch语句的流程跳转。在与某种情况吻合后,其它“case 常量表达式”及default都失效,只要没有流程转移语句,将一直执行到switch语句结束 如果switch语句包含在循环语句中,也可能因为其它流程转移语句如continue(循环短路)、return(函数返回)而终止。 for(k=0; k100; k+) switch(k%4) case 0:cout k; break; case 1:cout k*k; case 2:continue; case 3:cout
52、k*k*k; cout ”next loop”;使用switch语句时应注意的一些问题: 任何两个case之后的常量表达式的值不能相等; default部分是可选的,无论default置于什么位置,含义是固定的:只有在与其它case部分都不匹配时才与此情况匹配; switch语句可以嵌套,case部分中可以再使用其它switch语句。 总体上,switch是一种语法限制严格而功能又较弱的语句,难点在于理解语句的流程及如何终止。3.3 循环结构 循环结构的功能是在指定的条件满足时重复执行一段代码。通常,循环语句中“指定的条件”被称为“循环终止条件”,被重复执行的代码称为“循环体”。 C+中有三种
53、循环语句,分别是while语句、do-while语句和for语句。 3.3.1 while语句while语句的一般格式为: while(expression) statementint k, sum(0);k = 1;while(k=100) sum += k; k+; cout sum is sum endl; 利用一个级数公式求的近似值,计算精度为0.0001:nn1)1(91715131142/)1(#includeusing namespace std;int main( ) int t(1); double n(1.0), pi(0.0); while(1/n = 0.0001) p
54、i += t * (1/n); n += 2; t = -t; cout pi is 4*pi endl;3.3.2 do-while语句 do-while语句的一般形式如下: do statement while(expression); do-while语句与while语句类似,但因为先执行循环体后再测试条件,因此,循环体至少能够执行一次,此外无任何差别。 3.3.3 for语句 for语句的一般形式为: for(expression_1 ; expression_2 ; expression_3) statement for语句有一些不同于do-while和while语句的特点: 逗号运
55、算符的使用 逗号运算的经典用法是将多个表达式组合成一个大表达式,进而放在for循环内。 省略了某些表达式的for语句for(k=1, m=100; km; k+, m-) sum += k+m;for(; k=100; ) sum += k+; for( ; ; ) cout ”hello”; for结构中定义的变量 while、do-while和for循环的共同特点是都在循环终止条件为真时执行循环,为假时终止循环,任何一个语句都可以代替另外两个。 for(int k=1; k100) break; 2 continue语句 continue语句只用于循环语句的循环体中,功能是跳过contin
56、ue以后的语句,立刻开始下一次循环。 for(k=1; k=100; k+) if(k%3 = 0 | k%5 = 0)continue; cout k;很明显,continue语句不终止循环语句,但break语句终止循环或switch语句。 3 goto语句 使用goto语句时,首先需要定义一个标号。 定义标号的规则是自定义一个标识符并后跟一个冒号。int k(1), sum(0);loop:sum += k;k+; if(k=100)goto loop;cout sum is sum endl; 第3章 结束第4章 指针、引用与数组 关于内存地址 内存空间的访问方式 通过变量名访问 通过地
57、址访问 指针是内存地址与存储数据的类型相结合的产物。利用指针可以使程序绕过普通变量名读取或修改内存中存储的值。 有利于增强语言的能力和提高程序的效率 但使用错误的地址也会导致不可预测的后果4.1 指针4.1.1 指针的概念 1 变量的地址例如:定义变量int x(10); 假定程序运行时为x分配的内存空间的首地址(第一个字节的地址)是0 x12ff88,则可以认为0 x12ff88是一个指向x的指针。 &称为取地址运算符,表达式&x就是x的地址,或者说指向变量x的指针。 通常,程序中只使用&x来表示x的地址,并不需要知道&x的实际值是多少。 首先,在程序的两次运行时,分配给x的地址可能并不一致
58、。 其次,表达式&x中除了数值0 x12ff88之外,还含有此地址所指向的内存中所保存数据的类型信息。4.1.1 指针的概念(续) 2 指针变量 指针并不是整数。因此,需要使用一种专门的变量指针变量来存储指针。一般定义形式如下: type* 变量名=地址表达式; 例如: char* pc; int* pd; 指针变量的定义清楚地说明了指针的数据类型。4.1.1 指针的概念(续) 指针反映出两方面的含义 其一是指针的值,即指针指向内存的位置。 其二是利用该指针可以从内存中取出一个什么样的数据,指针类型“type*”中的type恰好说明了这种数据的类型。 由于type决定了通过指针取得的数据类型是
59、否正确,通常称其为指针的“基类型”。4.1.1 指针的概念(续) 例如,对于如下变量: int x(10); double y(2.3); 利用指针变量可以保存指针的值,如图: int x =10, *px = &x; double y =2.3, *py = &y;连续定义指针变量时每个名字之前都要加上*号,如:char* p1, *p2;/如果p2前无*号是字符型变量 4.1.1 指针的概念(续) 注意: 指针间的赋值应严格保证其类型相同。 &x与px、&y与py的差别只在于前者是常量,而后者是变量。102.3常量&x 变量px常量&y变量py指针中“包装”了2种信息int xdouble
60、 y0 x12ff88int0 x12ff84double4.1.2 指针运算 1 间接访问运算符 运算符“*”称为“间接访问”运算符。 “*指针”形式的“新的变量”,此变量对应着指针所指向的存储单元。 若一个指针p的类型为“type*”,则*p是一个type类型的变量,可以作为左值。 char x,*px = &x; /&x和px都是指向x的指针int y,*py = &y; /&y和py都是指向y的指针*(&x)和*px是char类型的变量,完全等同于变量x,*(&y)和*py是int类型的变量,与变量y完全相同。 4.1.2 指针运算(续) &与*是一对具有“相反意义”的运算符 &x是指
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 2025年春季车展场地租赁及专业展台设计与咨询综合服务协议
- 2025综合性养老机构护理人才培养与输送专项服务合同
- 2025虚拟课堂:远程英语教学服务合作协议范本
- 2025年新型建材研发与推广合作合同-智慧城市绿色建材供应与市场拓展服务协议
- 2025年餐饮连锁店员工职业发展及薪酬保障合同
- 2025年新型环保设施转让合同:环保技术成果使用权交易合同
- 智能化2025压路机租赁安全防护及维保服务合同
- 自考专业(汉语言文学)模考模拟试题及答案详解
- 2025年学历类自考中国现代文学史-管理学原理参考题库含答案解析(5套试卷)
- 2025年度高端缝纫技术专利授权及区域合作经营合同
- DB65-T 4773-2024 生物安全实验室消毒技术指南
- 成人体外膜氧合辅助期间感染防控专家共识2024版
- 2024年河北石家庄市井陉矿区人力资源和社会保障局公益性岗位招聘100人历年(高频重点提升专题训练)共500题附带答案详解
- 优化方案语文必修上册
- 云南省大中型水电站情况表
- 旅游景区规划设计方案
- 高中历史知识竞赛省公开课一等奖全国示范课微课金奖课件
- DL-T 5117-2021水下不分散混凝土试验规程-PDF解密
- 铁路专用线设计规范(试行)(TB 10638-2019)
- 国家药政法规培训
- 深圳航空公司招聘笔试真题
评论
0/150
提交评论