1、C+全册配套精品完整课件全册配套精品完整课件 (共共601页)页) C+程序设计 总 目 录 第1篇 基 本 知 识 第1章 C+的初步知识 2学时 第2章 数据类型与表达式 4学时 第2篇 面向过程的程序设计 第3章 程序设计初步 6学时 第4章 函数与预处理 4学时 第5章 数组 4学时 第6章 指针 8学时 第7章 自定义数据类型(自学) 第3篇 基于对象的程序设计 第8章 类和对象 4学时 第9章 关于类和对象的进一步讨论 6学时 第10章 运算符重载(自学) 第4篇 面向对象的程序设计 第11章 继承与派生 8学时 第12章 多态性与虚函数 8学时 第13章 输入输出流(自学) 第1
2、4章 C+工具 4学时 如何学好C+程序设计? 考核办法考核办法 综合成绩:平时成绩、期中考试成绩、综合成绩:平时成绩、期中考试成绩、 期末考试成绩期末考试成绩 第第1章章 C+的初步知识的初步知识 第第2章章 数据类型与表达式数据类型与表达式 第1篇 基 本 知 识 第1章 C+的初步知识 *1.1 从从C到到C+ *1.2 最简单的最简单的C+程序程序 1.3 C+程序的构成和书写形式程序的构成和书写形式 1.4 C+程序的编写和实现程序的编写和实现 1.5 关于关于C+上机实践上机实践 C语言产生于语言产生于20世纪世纪70年代,不是为初学年代,不是为初学 者设计的,而是为计算机专业人员
3、设计的。者设计的,而是为计算机专业人员设计的。 大多数系统软件和许多应用软件都是用大多数系统软件和许多应用软件都是用C 语言编写的。语言编写的。 优点:功能丰富、表达能力强、使用灵活方便、优点:功能丰富、表达能力强、使用灵活方便、 应用面广、目标程序效率高、可移植性好应用面广、目标程序效率高、可移植性好 特点:面向过程的结构化和模块化的语言特点:面向过程的结构化和模块化的语言 *1.1 从C到C+ C+是于是于20世纪世纪80年代初在年代初在C语言的基础语言的基础 上开发成功的。开发较大规模的程序,提上开发成功的。开发较大规模的程序,提 高软件开发的效率。高软件开发的效率。 特点:特点: C+
4、保留了保留了C语言原有的所有优点,增加了面向对象的语言原有的所有优点,增加了面向对象的 机制。机制。 C+是由是由C发展而来的,与发展而来的,与C兼容。并在原来面向过程兼容。并在原来面向过程 的机制基础上,对的机制基础上,对C语言的功能做了不少扩充。语言的功能做了不少扩充。 C+既可用于面向过程的结构化程序设计,又可用于既可用于面向过程的结构化程序设计,又可用于 面向对象的程序设计,不要把面向对象和面向过程对立面向对象的程序设计,不要把面向对象和面向过程对立 起来。起来。 C+上机实践上机实践 C+编译系统有很多,如编译系统有很多,如Visual C+、 C+ Builder等;无论在什么环境
5、下编译等;无论在什么环境下编译 和运行一个和运行一个C+程序,应当掌握标准程序,应当掌握标准C+。 应当能在不同的应当能在不同的C+环境下运行自己的程环境下运行自己的程 序,并且了解不同的序,并且了解不同的C+编译系统的特点编译系统的特点 和使用方法,在需要时能将自己的程序方和使用方法,在需要时能将自己的程序方 便地移植到不同的平台上。便地移植到不同的平台上。 例:输出一行字符:例:输出一行字符: “This is a C+ program.”。 #include /包含头文件包含头文件iostream using namespace std; /使用命名空间使用命名空间std int mai
6、n( ) coutThis is a C+ program.; return 0; *1.2 最简单的C+程序 例例1.2 求求a和和b两个数之和。两个数之和。 #include /预处理命令预处理命令 using namespace std; /使用命名空间使用命名空间std int main( ) /主函数首部主函数首部 /函数体开始函数体开始 int a,b,sum; /定义变量定义变量 cinab; /输入语句输入语句 sum=a+b; /赋值语句赋值语句 couta+b=sumendl; /输出语句输出语句 return 0; /函数结束函数结束 “/使用命名空间使用命名空间std”
7、是一个注释,是一个注释,C+规定规定 在一行中如果出现在一行中如果出现“/”,则从它开始到本行末,则从它开始到本行末 尾之间的全部内容都作为注释。尾之间的全部内容都作为注释。 (思考思考)应用函数调用的方法编写程序应用函数调用的方法编写程序? 例例1.3 给出三个数给出三个数a、b和和c,求三个数,求三个数 中的最大数。中的最大数。 例例1.4 包含类的包含类的C+程序。程序。 #include using namespace std; class Student / 声明一个类,类名为声明一个类,类名为Student private: / 以下为类中的私有部分以下为类中的私有部分 int n
8、um; / 私有变量私有变量num int score; / 私有变量私有变量score public: / 以下为类中的公用部分以下为类中的公用部分 void setdata( ) / 定义公用函数定义公用函数setdata cinnum; / 输入输入num的值的值 cinscore; / 输入输入score的值的值 void display( ) / 定义公用函数定义公用函数display coutnum=numendl; / 输出输出num的值的值 coutscore=scoreendl; /输出输出score的值的值 ; / 类的声明结束类的声明结束 Student stud1,st
9、ud2; int main( ) / 主函数首部主函数首部 stud1.setdata( ); / 调用对象调用对象stud1的的setdata函数函数 stud2.setdata( ); / 调用对象调用对象stud2的的setdata函数函数 stud1.display( ); / 调用对象调用对象stud1的的display函数函数 stud2.display( ); / 调用对象调用对象stud2的的display函数函数 return 0; 在一个类中包含两种成员:在一个类中包含两种成员: 数据和函数。数据和函数。 在在C+中把一组数据和有权调用这些数中把一组数据和有权调用这些数 据
10、的函数封装在一起,组成一种称为据的函数封装在一起,组成一种称为“类类 (class)”的数据结构。的数据结构。 类可以体现数据的封装性和信息隐蔽。类可以体现数据的封装性和信息隐蔽。 在大多数情况下,会把所有数据指定为私在大多数情况下,会把所有数据指定为私 有,以实现信息隐蔽。有,以实现信息隐蔽。 而把函数指定为公有。而把函数指定为公有。 Visual C+编写编写C+程序的三种方式程序的三种方式 1、创建单个文件、创建单个文件 2、创建工程(、创建工程(Win32 Console Application) 往工程里添加文件往工程里添加文件 3、创建工作区、创建工作区往工作区中添加工程往工作区中
11、添加工程往工程往工程 里添加文件里添加文件 C+程序的结构和书写格式归纳如下:程序的结构和书写格式归纳如下: (1) 一个一个C+程序可以由一个程序文程序可以由一个程序文 件或多个程序文件构成。在程序编译件或多个程序文件构成。在程序编译 时,编译系统分别对各个文件进行编时,编译系统分别对各个文件进行编 译,因此,一个文件是一个编译单元。译,因此,一个文件是一个编译单元。 1.3 C+程序的构成和书写形式程序的构成和书写形式 (2) 在一个程序单位中,可以包括以下几个部分:在一个程序单位中,可以包括以下几个部分: 预处理命令。如预处理命令。如#include命令。命令。 全局声明部分全局声明部分
12、(在函数外的声明部分在函数外的声明部分)。在。在 这部分中包括对用户自己定义的数据类型的声这部分中包括对用户自己定义的数据类型的声 明和程序中所用到的变量的定义。明和程序中所用到的变量的定义。 函数。函数是实现操作的部分,每一个函数。函数是实现操作的部分,每一个 程序必须包括一个或多个函数,其中必须有一程序必须包括一个或多个函数,其中必须有一 个个(而且只能有一个而且只能有一个)主函数主函数(main函数函数), 程序程序 从从main函数开始执行。函数开始执行。 #include #include using namespace std;using namespace std; int a,
13、b;int a,b; int main( ) int main( ) return 0; return 0; 预处理命令预处理命令 全局声明部分全局声明部分 函数函数 (3) 一个函数由两部分组成一个函数由两部分组成: 函数首部,即函数的第一行。函数首部,即函数的第一行。 函数类型函数类型 函数名函数名 参数类型参数类型 参数参数(形参形参)名名 int max(int x , int y , int z) 一个函数名后面必须跟一对圆括号,一个函数名后面必须跟一对圆括号, 函数参数函数参数 可以缺省,可以缺省,如如int main( )。 函数体,即函数首部下面的大括号内的部分。函数体,即函数
14、首部下面的大括号内的部分。 由若干个执行语句组成。由若干个执行语句组成。 (4) 语句包括两类。一类是声明语句,另语句包括两类。一类是声明语句,另 一类是执行语句。一类是执行语句。 C+语句必须以分号语句必须以分号 结束。结束。 (5) 书写格式自由,一行内可以写几个语句,书写格式自由,一行内可以写几个语句, 一个语句可以分写在多行上。一个语句可以分写在多行上。 程序出现的错误种类 1、语法错误语法错误:编译时检查出来:编译时检查出来 如如 couta; 2、逻辑错误逻辑错误:编译是通过的,但运行结果不对。:编译是通过的,但运行结果不对。 如:如:sum=1+2+3+10 int i=0,su
15、m=0 while (iab; couta/b; 当当b输入为输入为0时,程序运行出错。时,程序运行出错。 1.4 C+程序的编写和实现程序的编写和实现 第2章 数据类型与表达式 2.1 C+的数据类型的数据类型 2.2 常量常量 2.3 变量变量 2.4 C+的运算符的运算符 2.5 算术运算符与算术表达式算术运算符与算术表达式 2.6 赋值运算符与赋值表达式赋值运算符与赋值表达式 2.7 逗号运算符与逗号表达式逗号运算符与逗号表达式 数据数据程序处理的对象程序处理的对象 数据类型数据类型根据数据的表达形式的不根据数据的表达形式的不 同而划分的类别。同而划分的类别。 各种数据在内存中均以各种
16、数据在内存中均以0、1的二进制形的二进制形 式存储,但存储格式不同。式存储,但存储格式不同。 2.1 C+的数据类型 整型数据分为:短整型整型数据分为:短整型(short int 或或short) 一般整型一般整型(int) 长整型长整型(long int或或long) sizeof(数据类型数据类型):可确定数据类型的字节长:可确定数据类型的字节长 度。度。 例:例:coutsizeof(int)endl; 整型(整型(short int、int、long int)和字符型和字符型char的前的前 面面,可加修饰符可加修饰符signed(表示表示“有符号有符号”)或或 unsigned(表示
17、表示“无符号无符号”),默认为默认为signed 。 浮点型浮点型(又称实型又称实型)数据分为:数据分为: 单精度单精度(float) 双精度双精度(double) 长双精度长双精度(long double) 一般用一般用double定义存放小数的变量。定义存放小数的变量。 布尔型布尔型(bool):C语言无此类型,它用语言无此类型,它用0代表代表 “假假”,非,非0(如(如1)代表)代表“真真”。C+中添加了中添加了 该类型,其值为该类型,其值为True和和False。但不是所有编译器但不是所有编译器 都支持。都支持。 空类型(空类型(void):):无值,不能用来定义变量。无值,不能用来定
18、义变量。 常量的值是不能改变的,程序中一般包含常量的值是不能改变的,程序中一般包含 直接常量(一般常量)和符号常量两种。直接常量(一般常量)和符号常量两种。 2.2 常量 2.2.1 什么是常量 根据数据类型的不同,根据数据类型的不同, 常量可分为:常量可分为: 整型常量整型常量 实型常量(浮点型常量)实型常量(浮点型常量) 字符常量字符常量 字符串常量字符串常量 1、整型常量、整型常量(整数)整数) 分十进制整数、八进制整数和十六进制整分十进制整数、八进制整数和十六进制整 数。数。 书写格式:书写格式: 整型常量类型整型常量类型表达形式表达形式有无正负有无正负 十进制十进制10、10L或或1
19、0l有正负有正负 八进制八进制012只有正只有正 十六进制十六进制0 xA只有正只有正 注意:注意:10L、10l 表示长整型,表示长整型,10为一般整型。为一般整型。 2. 浮点型常量(实型常量)浮点型常量(实型常量) 有两种不同的方式表示:有两种不同的方式表示: 浮点型常量表示方法浮点型常量表示方法表达形式表达形式 十进制小数形式十进制小数形式0.12 、-1.0 、5. 、 .6 指数形式指数形式12e3、1.2e4、0.12E5 在程序中不论把浮点数写成小数形式还是指数形在程序中不论把浮点数写成小数形式还是指数形 式,在内存中都是以规范化的指数形式存放。式,在内存中都是以规范化的指数形
20、式存放。 注:注: (1) 指数形式的书写指数形式的书写 数符数符 数字部分数字部分 指数部分指数部分 E和和e的前面必须要有数字,且的前面必须要有数字,且E后面的指后面的指 数必须为整数。数必须为整数。 例:例:e3 、2.1e3.5 、.e3 、e (2)浮点型常数缺省为浮点型常数缺省为double型,如表示型,如表示float型,型, 则在实数后加则在实数后加f或或F。 如:如:34.56f 34.5 (1)、普通的字符常量)、普通的字符常量 用单撇号括起来的一个字符,如用单撇号括起来的一个字符,如a,#。在内存中在内存中 占一个字节。占一个字节。 注意:注意: 只能包括一个字符只能包括
21、一个字符,如,如AB 是不合法的。是不合法的。 字符常量区分大小写字母字符常量区分大小写字母,如,如A和和a是两个不是两个不 同的字符常量。同的字符常量。 撇号撇号()是定界符,而不属于字符常量的一部分。是定界符,而不属于字符常量的一部分。 3 字符常量 (2)、转义字符常量)、转义字符常量 非图形字符(如回车、制表符)及非图形字符(如回车、制表符)及、 、“等等 字符。字符。 用以用以 “”开头的转义字符常量表示这些特殊开头的转义字符常量表示这些特殊 字符,见字符,见P24表表2.2。 n 代表一个代表一个“换行换行”符。符。 “cout n ; ” 与与“coutendl; ” 作用相同。
22、作用相同。 ddd:1至至3位位8进制数。进制数。101表示表示A,007表示表示a 响铃响铃 xhh:1至至2位位16进制数。进制数。x41表示表示A, x07表示表示a 响铃响铃 0为空白符,即为空白符,即NULL,码值为码值为0。 (与(与0的区别,的区别,0的码值为的码值为 48) (3)、)、 字符数据在内存中的存储形式字符数据在内存中的存储形式 及其使用方法及其使用方法 存储该字符相应的存储该字符相应的ASCII码,并以二进码,并以二进 制形式存放。制形式存放。 例如:例如: c1=a c2=b 注意:字符数据的运算,均以字符的注意:字符数据的运算,均以字符的ASCII码码 进行运
23、算。进行运算。 例例2.1字符数据和整型数据相互赋值。字符数据和整型数据相互赋值。 #include using namespace std; int main( ) int i; char j; /j是字符型变量是字符型变量 i=A; /将一个字符常量赋给整型变量将一个字符常量赋给整型变量i j=97; /将一个字符常量赋给整型变量将一个字符常量赋给整型变量j couti njn; return 0; 字符数据的使用方法:字符数据的使用方法: 1、字符数据和整型数据可以相互赋值。、字符数据和整型数据可以相互赋值。 2、字符数据和整型数据之间可以运算。、字符数据和整型数据之间可以运算。 例例2
24、.2 字符数据与整数进行算术运算。下面程序字符数据与整数进行算术运算。下面程序 的作用是将小写字母转换为大写字母。的作用是将小写字母转换为大写字母。 #include using namespace std; int main( ) char c1,c2; c1=a; c2=b; c1=c1-32; c2=c2- a +A; coutc1 c2endl; return 0; 思考:思考: 如何将一个数字字如何将一个数字字 符转换成数值:符转换成数值:1 转换为转换为1? 0- 0=0 1- 0=1 4- 0=4 4. 字符串常量字符串常量 用双撇号括起来的部分就是字符串常量。如用双撇号括起来的
25、部分就是字符串常量。如 abc。 注意:注意:0 和和 “0” 的区别。的区别。0为字符为字符 常量,常量,“0”为字符串常量。为字符串常量。 C+规定以字符规定以字符0作为字符串结束标志。作为字符串结束标志。 在内存中以在内存中以0为结尾。为结尾。 0在输出时不显示,只表示字符串结束。在输出时不显示,只表示字符串结束。 cout abc s endl; 输出输出4个字符个字符abcs,而不包括而不包括0 。 字符串常量字符串常量abc在内存中占在内存中占4个字节个字节(而不是而不是3 个字节个字节),见图。,见图。 注意:注意: a和和a不同,不同,a是字符串常量,是字符串常量,a 是字符常
26、量。前者占两个字节,后者占是字符常量。前者占两个字节,后者占1个字节。个字节。 char c; /定义一个字符变量定义一个字符变量 c=a; c=a; 思考:思考: 字符串常量字符串常量abcn包含几个字符包含几个字符? 编译系统遇到编译系统遇到“”时就会把它认作转义字符时就会把它认作转义字符 的标志,把它和其后的字符一起作为一个转义的标志,把它和其后的字符一起作为一个转义 字符。字符。 在在C+程序设计中,常用程序设计中,常用 一个符号名代表一个常一个符号名代表一个常 量,称为符号常量。量,称为符号常量。 预编译命令:预编译命令: #define 符号常量名符号常量名 值值 2.2.4 符号
27、常量 例例:已知圆半径已知圆半径r , 计计 算圆的周长及面积。算圆的周长及面积。 在程序运行期间值可以改变的量称为变量。在程序运行期间值可以改变的量称为变量。 2.3 变量变量 2.3.1 什么是变量什么是变量 变量变量 变量名变量名 变量值变量值 变量类型变量类型 C+规定标识符只能规定标识符只能由字母、数字和下划线由字母、数字和下划线3种种 字符组成,且第一个字符必须为字母或下划线字符组成,且第一个字符必须为字母或下划线。 如:如: sum, total2, _day, Student_name 2.3.2 变量名命名规则变量名命名规则 不能与不能与C+关键字相同(如:不能取名为关键字相
28、同(如:不能取名为main、 Class、if、friend等)等) 下面标识符是否合法:下面标识符是否合法: M.D.John , #33, 3G64 , Ling li , C+,return _student, s_max, Float, float 注意注意:大写字母和小写字母被认为是两个不同的大写字母和小写字母被认为是两个不同的 字符字符。 如:如:sum和和SUM是两个不同的变量名。是两个不同的变量名。 命名约定:命名约定: 1、变量名、函数名用小写字母;、变量名、函数名用小写字母; 2、符号常量名及宏用大写字母;、符号常量名及宏用大写字母; 3、下划线开头的名字常为系统程序(库函
29、数、下划线开头的名字常为系统程序(库函数 用),用户一般不用。用),用户一般不用。 4、要有意义:如、要有意义:如sum表示表示“求和变量求和变量”。 国外软件命名时,第国外软件命名时,第1个字母表示数据类型,如个字母表示数据类型,如 isum 变量必须变量必须“先定义,后使用先定义,后使用” 。 如:如:float a , b , c; 定义定义a,b,c为单精度型变量,注意各变量间以逗为单精度型变量,注意各变量间以逗 号分隔,最后是分号。号分隔,最后是分号。 2.3.3 定义变量定义变量 C语言要求变量的定义应该放在所有的执行语语言要求变量的定义应该放在所有的执行语 句之前,而句之前,而C
30、+则只要求在第一次使用该变量之则只要求在第一次使用该变量之 前进行定义即可。前进行定义即可。 int a;/定义定义a为一般整型变量为一般整型变量 long b;/定义定义b为长整型变量为长整型变量 short c;/定义定义c变量变量 unsigned short d; /定义定义d为无符号短整型变量为无符号短整型变量 float e;/定义定义e为单精度浮点型变量为单精度浮点型变量 double f; /定义定义f为双精度浮点型变量为双精度浮点型变量 long double g; /定义定义g为长双精度浮点型变量为长双精度浮点型变量 char h; /定义定义h为字符型变量为字符型变量 注
31、意:注意:string i 标准数据类型中无字符串类型的变量标准数据类型中无字符串类型的变量 变量定义时赋初值。初值可以是常量,也变量定义时赋初值。初值可以是常量,也 可以是一个表达式。如可以是一个表达式。如 float a , b = 5.78, c= 2*sin(2.0); 2.3.4 变量赋初值变量赋初值 注意:数学函数调用必须包含头文件注意:数学函数调用必须包含头文件“cmath”(或或math.h) : #include 或或 #include 如果对变量未赋初值,则该变量的初值是一个如果对变量未赋初值,则该变量的初值是一个 不可预测的值。不可预测的值。(变量未赋值就使用非常危险。)
32、(变量未赋值就使用非常危险。) coutaendl; 在变量定义时,对多个变量赋予同一初值,在变量定义时,对多个变量赋予同一初值, 必须分别指定,不能写成:必须分别指定,不能写成: float a = b = c = 4.5; 而应写成而应写成 : float a = 4.5 , b = 4.5 , c = 4.5; 或或 float a , b ; float c=a=b=4.5; 注意:注意: 1、在定义常变量时必须同时对它初始化。、在定义常变量时必须同时对它初始化。 2、常变量不能出现在赋值号的左边。、常变量不能出现在赋值号的左边。 const int pi; pi = 3.1415;
33、例如:例如: const int pi = 3.1415; const表示定义常变量,变量的值在程序运表示定义常变量,变量的值在程序运 行期间不能改变行期间不能改变。 2.3.5 常变量常变量 #define命令定义的符号常量与命令定义的符号常量与const定义的常变定义的常变 量的区别:量的区别: 1、 #define定义的符号常量只是用一个符号代定义的符号常量只是用一个符号代 替一个常量值,在预编译时把所有符号常量替替一个常量值,在预编译时把所有符号常量替 换为所指定的字符串,在内存中并不存在以符换为所指定的字符串,在内存中并不存在以符 号常量命名的存储单元。号常量命名的存储单元。 2、
34、const定义的常变量具有变量的特征,有类定义的常变量具有变量的特征,有类 型,在内存中存在着以它命名的存储单元。与型,在内存中存在着以它命名的存储单元。与 一般变量惟一的不同是指定变量的值不能改变一般变量惟一的不同是指定变量的值不能改变 (只读)。(只读)。 (通常可用来定义函数参数通常可用来定义函数参数) C+的运算符十分丰富,使得的运算符十分丰富,使得C+的运算的运算 十分灵活方便。十分灵活方便。C+提供了以下运算符:提供了以下运算符: (1) 算术运算符算术运算符 +(加加)-(减减) *(乘乘) /(除除) %(整除求余整除求余)+(自自 加加) -(自减自减) (2) 关系运算符关
35、系运算符 (大于大于)(小于小于) (等于等于)(大于或大于或 等于等于)(小于或等于小于或等于)!(不等于不等于) 2.4 C+的运算符 () 逻辑运算符逻辑运算符 (逻辑与逻辑与) |(逻辑或逻辑或) !(逻辑非逻辑非) () 位运算符位运算符 (按位右移按位右移) (按位与按位与) |(按位或按位或) (按位异或按位异或) (按位取反按位取反) () 赋值运算符赋值运算符 (及其扩展赋值运算符及其扩展赋值运算符) () 条件运算符条件运算符 (?:) () 逗号运算符逗号运算符 (,) () 指针运算符指针运算符 (*) (9) 引用运算符和地址运算符引用运算符和地址运算符 () (10
36、) 求字节数运算符(求字节数运算符(sizeof) (11) 强制类型转换运算符(强制类型转换运算符( (类型类型) 或类型或类型( )) (12) 成员运算符成员运算符 (.) (13) 指向成员的运算符指向成员的运算符 (-) (14) 下标运算符下标运算符 ( ) (15) 其他其他 (如函数调用运算符()(如函数调用运算符() 由以上运算符与常量、变量或函数由以上运算符与常量、变量或函数 一起构成的每个表达式,在求值后一起构成的每个表达式,在求值后 都有一个确定的值。都有一个确定的值。 2.5 算术运算符与算术表达式算术运算符与算术表达式 2.5.1 基本的算术运算符基本的算术运算符
37、+、- -、+(正号正号)、 (负号负号) *(乘乘)、/(除除)、%(取余取余) +(加法加法)、 (减法减法) 优优 先先 级级 高高 到到 低低 (1)/(除)(除) 例:例:5/2 值为 值为: 2 若若 / 的两操作数都为整数,则为整除。的两操作数都为整数,则为整除。 9/2值为值为: 4 例:例:5/2.0 5.0/2 5.0/2.0 值为:值为:2.5 若若 / 的两操作数中有一个浮点数,则为的两操作数中有一个浮点数,则为 正常的整法运算。正常的整法运算。 例:例: int i = 15; float f; f = i / 10; 结果为:结果为:f = 1 如果希望如果希望 f
38、 的结果为的结果为1.5 ,则可将第三条语句改为:则可将第三条语句改为: 例:在例:在C+中,中, (7/3+1)+5/6 的值是(的值是( )3 f = (float) i /10 ; 或或 f = i /10.0; 要求要求 % 的两操作数必须为整数,不允许的两操作数必须为整数,不允许 对浮点数操作。对浮点数操作。 例:例:3 % 4=3 4 % 4=0 - 4 % 3= - 1 4 % -3=1 (2) % (取余取余) 余数的符号与被除数相同。余数的符号与被除数相同。 n = 40 % 5 n = 40 % 7 n = - 40 % 7 n = - 40 % - 7 0 5 -5 -5
39、 运算对象包括常量运算对象包括常量(数值常量、字符常量,不能对数值常量、字符常量,不能对 字符串常量进行运算字符串常量进行运算) 、变量、变量、函数等。函数等。 a*b/c-1.5+a a*b/c-1.5+ab 2.5.2 算术表达式和运算符的优先级与结合性算术表达式和运算符的优先级与结合性 书后附录B:运算符与结合性 在求解表达式时,先按一个运算对象两侧的运在求解表达式时,先按一个运算对象两侧的运 算符的优先级别高低次序执行。算符的优先级别高低次序执行。 a-b*c 如果在一个运算对象两侧的运算符的优先级如果在一个运算对象两侧的运算符的优先级 别相同,别相同, 则按则按“自左至右自左至右”结
40、合,如结合,如 a-b+c 在表达式中常遇到不同类型数据之间进行运算,在表达式中常遇到不同类型数据之间进行运算, 如如:10 + a+1.5 - 1.4 * A 2.5.3 表达式中各类数值型数据间的混合运算表达式中各类数值型数据间的混合运算 在进行运算时,不同类型的数据要先转换成同在进行运算时,不同类型的数据要先转换成同 一类型,然后进行运算。转换的规则按图所示。一类型,然后进行运算。转换的规则按图所示。 假设已指定为整型变量,为假设已指定为整型变量,为float变量,变量, 为为long型,有下面表达式:型,有下面表达式: 10+a+ i * f i / e (上述的类型转换是由系统自动完
41、成的上述的类型转换是由系统自动完成的) 10+a+ i * f i / e 1 例:例: 1.5+ 32/5 的值是(的值是( )7.5 例:例: (1.5+ 32)/ 5的值是(的值是( )6.7 (1)、a+ :先取先取a的值作为表达式的值,然的值作为表达式的值,然 后后a=a+1 例:例:int a; a = 2 ; j = a+ 2.5.4 自增和自减运算符自增和自减运算符( + 、- ) 结果为:结果为:j=2 , a=3 (2)、+ a :先先a=a+1 , 然后取然后取a的值作为表达的值作为表达 式的值。式的值。 例:例:int a; a = 2 ; j = +a 结果为:结果为
42、:j=3 , a=3 (3)、 a - :先取先取a的值作为表达式的值,然后的值作为表达式的值,然后 a=a-1 例:例: int a; a = 2 ; j = a- 结果为:结果为:j=2 , a=1 (4)、 - a :先先a=a+1 , 然后取然后取a的值作为表达式的值作为表达式 的值。的值。 例:例: int a; a = 2 ; j = -a 结果为:结果为:j=3 , a=3 例:写出下列程序运行结果:例:写出下列程序运行结果: int a = 3; int b = +a; couta bendl; int c = a+; couta cendl; 答案:答案:4 4 5 4 #i
43、nclude using namespace std; int main() int i , j , m , n; i=8; j=10; m=+i+j+; n=i+j; coutitjtnendl; return 0; 答案:答案:10 12 20 注意:注意: 后置后置+、-的优先级的优先级 高于前置高于前置+、- 正确地使用正确地使用+和和-,可以使程序简洁、清晰、高,可以使程序简洁、清晰、高 效。效。 请注意:请注意: (1)(1)自增(减)运算符只能用于变量,而不能用于自增(减)运算符只能用于变量,而不能用于 常量或表达式。常量或表达式。( (5+ 5+ 、(、(a+5)+a+5)+、
44、a+a+) ) (2)(2)自增(减)运算符使用十分灵活,但在很多情自增(减)运算符使用十分灵活,但在很多情 况下可能出现歧义性,产生况下可能出现歧义性,产生“意想不到意想不到”的副作用。的副作用。 (3) (3) 自增(减)运算符在自增(减)运算符在C+C+程序中是经常见到程序中是经常见到 的,常用于循环语句中,使循环变量自动加的,常用于循环语句中,使循环变量自动加1 1。 也用于指针变量,使指针指向下一个地址。也用于指针变量,使指针指向下一个地址。 在表达式中不同类型的数据会自动地转换类在表达式中不同类型的数据会自动地转换类 型,以进行运算。型,以进行运算。 2.5.5 强制类型转换运算符
45、强制类型转换运算符 强制类型转换的一般形式为:强制类型转换的一般形式为: (类型名)(表达式)(类型名)(表达式) 利用强制类型转换运算符将一个表达式转换利用强制类型转换运算符将一个表达式转换 成所需类型。例如:成所需类型。例如: (double) (将将a的值转换成的值转换成double类型类型) (int)(x+y) (将将x+y的值转换成整型的值转换成整型) (float)(5/2) (2.0) (float)5/2 (2.5) 如如int(x) 、int(x+y)、float(5)/2 C+还增加了以下形式:还增加了以下形式: 类型名(表达式)类型名(表达式) 注意:这种写法表达式的括
46、号不能省略。注意:这种写法表达式的括号不能省略。 类似于函数调用的写法。类似于函数调用的写法。 例例2.4 强制类型转换。强制类型转换。 #include using namespace std; int main( ) float x=3.6 , f; int a=16 , b=5 , i; i = (int)x; f=(float)a+a/b; coutx=x,i= iendl; couta=a,f= fendl; return 0; 输出结果:输出结果: x=3.6,i=3 a=16,f=19 1、如定义、如定义int e=8;double f=6.4,g=8.9;则表达式则表达式 f+
47、int(e/3*int(f+g)/2)%4的值为(的值为( ) 2、若变量、若变量a已说明为已说明为float类型,类型,i为为int类型类型,则下则下 列哪几个表达式能实现将列哪几个表达式能实现将a的数值保留小数点后的数值保留小数点后 两位,第三位进行四舍五入的运算。(两位,第三位进行四舍五入的运算。( ) A) a=(a*100+0.5)/100.0; B) i=a*100+0.5;a=i/100.0; C) a=(int)(a*100+0.5)/100.0; D) a=(a/100+0.5)*100.0; 9.4 B、C 作用是将右边的数据赋给左边的一个变量。作用是将右边的数据赋给左边的
48、一个变量。 如如“a=3”,把常量,把常量3赋给变量赋给变量a。 2.6 赋值运算符与赋值表达式赋值运算符与赋值表达式 2.6.1 赋值运算符赋值运算符( = ) 双目运算,从右到左。如双目运算,从右到左。如d=a=b 赋值操作是一个表达式,每个表达式在求值后都赋值操作是一个表达式,每个表达式在求值后都 有一个确定的值,其值为赋值号左边表达式的值:有一个确定的值,其值为赋值号左边表达式的值: 例:例:cout(x=5)endl; 当赋值运算符两边类型不一致时,根据左边的类当赋值运算符两边类型不一致时,根据左边的类 型进行自动转换(数值型或字符型)型进行自动转换(数值型或字符型) 。 (1) i
49、nt i; float f=3.6; i=f; coutiendl; (2) int i=3; float f=3.6; f=i; coutfendl; (3) char i=A; float f=3.6; f=i; coutfendl; 2.6.2 赋值过程中的类型转换赋值过程中的类型转换 注意:注意:short a=10; float b=70000.5; a=b; 将将b的值的值70000.5赋给赋给a,但但70000.5超过超过short 的取值范围,超过的部分将会扔掉。运行结果将会的取值范围,超过的部分将会扔掉。运行结果将会 出错,但编译不会提示出错。出错,但编译不会提示出错。 3
50、3 65 (4) 将一个将一个int、short或或long型数据赋给一个型数据赋给一个char 型变量,只将其低型变量,只将其低8位原封不动地送到位原封不动地送到char型变型变 量(发生截断)。例如量(发生截断)。例如 short int i=289; char c; c=i; /将一个将一个short int型数据赋给一个型数据赋给一个char型型 变量变量 设有语句int a=258,b;unsigned char c;b=c=a; 则b的值是( ) 2 (6) 将将signed(有符号有符号)型数据赋给长度相同的型数据赋给长度相同的 unsigned(无符号无符号)型变量,将存储单元