《Visual C++程序设计》
授课专业:计算机科学技术
授课年级:2002级本科
授课方式:课堂讲授;实验课
教学方式:多媒体教学
课程教学总学时数:48 学分数 3
课时分配:课堂讲授 32 学时;实验课 16 学时
教材:
《Visual C++与面向对象程序设计(第二版)》,吕军等,高教出版社,2003年8月
参考书目:
《C++程序设计教程》,钱能,清华大学出版社
《Visual C++程序设计与软件技术基础》,马建红沈西挺,中国水利水电出版社
《Visual C++图形用户界面开发指南》,李博轩,清华大学出版社
《新编Visual C++6.0 教程》,北京科海培训中心编著
《C++ PRIMER (3RD)中文版》Stanley .Lippman,Josee Lajoie,中国电力出版社
《C++程序设计语言(特别版)》(美)Bjarne Stroustrup,机械工业出版社
常用网址:
1.https://www.sodocs.net/doc/cc6261020.html,
2.https://www.sodocs.net/doc/cc6261020.html,/subject_c.asp
3.https://www.sodocs.net/doc/cc6261020.html,
目录
第一章C++入门
1.1 软件开发与C++语言
1.2 算法与程序
1.3 输入、编译、调试和运行一个C++程序
1.4 C++语言的输入与输出命令
1.5 程序设计语言的发展
1.6 C++程序的基本要素
1.6.1 标识符、关键词和标点符号
1.6.2 注释
1.6.3 源程序
1.7 编译预处理
1.7.1 宏定义
1.7.2 文件包含
1.8 Visual C++的集成开发环境
1.8.1 菜单和工具栏
1.8.2 Developer Studio窗口
1.8.3用Developer Studio编写和调试简单C++程序
1.8.4 菜单选项、快捷键和工具栏
第二章控制结构
2.1 程序的基本控制结构
2.2 C++的控制结构
2.2.1 顺序结构
2.2.2 选择结构
2.2.3 循环结构
2.3 结构化程序设计
2.4 伪代码
2.5 结构化程序设计方法简介
2.6 C++的其他控制转移语句
2.6.1 switch语句
2.6.2 goto语句和语句标号
2.6.3 break语句和continue语句
2.6.4 exit()函数和abort()函数
2.7 Developer Studio的文本编辑器
第三章基本数据类型
3.1 数据类型
3.1.1 整型数据的表示方法
3.1.2 实型数据的表示方法
3.2 常量
3.2.1 整型常量
3.2.2 实型常量
3.2.3 字符常量
3.2.4 字符串常量
3.3 变量
3.3.1 变量的声明
3.3.2 变量的初始化
3.4 数组
3.5 字符型数组和字符串处理库函数
3.6 类型修饰符和常量修饰符
3.7 枚举类型
3.8 typedef语句
3.9 Develper Studio的文件处理功能
3.10 Visual C++程序的编译、链接和运行
3.11 查看和修改编译、链接错误
第四章表达式
4.1 算术运算符和算术表达式
4.2 逻辑运算符和逻辑表达式
4.3 赋值运算符和赋值表达式
4.4 自增运算符
4.5 表达式中各运算符的运算顺序
4.6 其他具有副作用的运算符
4.7 问号表达式和逗号表达式
4.8 类型不同数据之间的混合算术运算
4.9 运行错误的判断与调试
4.10 基本调试手段
4.11 注释号在调试中的作用
4.12 条件编译
第五章函数
5.1 函数的定义
5.2 函数的调用
5.3 函数原型
5.4 函数间的参数传递
5.4.1 值调用
5.4.2 引用调用
5.5 函数重载
5.6 局部变量和全局变量
5.7 内联函数
5.8 带有默认参数的函数
5.9 C++的库函数
5.10 函数模板
5.11 变量的存储类别
5.12 Develooper Studio的跟踪调试功能第六章指针
6.1 指针与地址
6.1.1 地址
6.1.2 指针
6.2 指针运算
6.3 指针与数组
6.4 动态存储分配
6.5 指针与函数
6.5.1 指针作为函数的参数
6.5.2 返回指针的函数
6.5.3 指向函数的指针
6.6 指针的数组
6.7 指针的初始化
6.8 Visual C++的帮助功能
第七章类和对象
7.1 面向对象的思想
7.2 面向对象程序设计的特点
7.3 类与对象
7.3.1 类的定义
7.3.2 成员函数的定义
7.3.3 内联成员函数
7.3.4 对象
7.4 构造函数与析构函数
7.5 数据成员的初始化
7.6 对象与指针
7.7 const修饰符
7.8 MFC的CString类
7.9 MFC的CTime类和CTimeSpan类
7.9.1 CTime类
7.9.2 CTimeSpan类
7.9.3 CTime类和CTimeSpan类的运算
7.10 类的嵌套
7.11 如何在程序中使用MFC类库
7.12 使用FileView标签
第八章继承与派生
8.1 继承与派生
8.1.1 为什么使用继承
8.1.2 派生类的定义
8.1.3 派生类中的变化
8.2 派生类的继承方式
8.2.1 公有继承
8.2.2 私有继承
8.2.3 保护继承
8.3 派生类的构造函数和析构函数
8.3.1 构造函数
8.3.2 析构函数
8.4 显式访问基类成员
8.5 静态成员
8.6 类模板
8.7 使用Class View标签
第九章多态性
9.1 多态性概述
9.2 派生类对象替换基类对象
9.3 虚函数
9.3.1 虚函数定义
9.3.2 虚函数的使用限制
9.4 抽象类
9.5 运算符重载
9.6 文件处理
9.7 异常处理机制
第一章C++入门
教学目的:了解C++程序的基本特点, 熟悉Visual C++集成开发环境的基本使用方法。
重点:了解C++程序的基本特点,Visual C++的集成开发环境。
难点:C语言、C++、VC之间的关系
1.1 软件开发与C++语言
一、C语言的发展历程
B-->C-->C++ Vc++
B是无类型语言(需解释)
C++是面向对象的语言(解释),使开发软件的可重用性、可维护性和可靠性,具有了极大的优势。C是C++的子集,C++是C的超集。
VC是可视化的C++集成环境
二、本课程的目的
1.C++的程序结构(面向过程)
2.VC集成环境的使用
3.面向对象的构成思想
4.学习利用系统提供的对象进行面向对象的编程(简单)
1.2 算法与程序
算法:解决问题的方法和步骤
程序:用计算机语言对算法的描述
例1:
1.根据算法特性,至少要有一个输出,如果使用C语言的printf和scanf 函数完成输入输出,则必须打开stdio.h头文件。c++中数据的输入输出通过cin和cout与>>、<<配合实现,但cin和cout均不是语句,也不是函数,是流对象。因此只要使用这两个(数据)流对象,就必须打开iosteam.h头文件。
2. c++规定任何函数必须有函数类型(没有缺省类型),由于main函数不能被其他函数调用,所以不需要存放返回值的空间,因此通常将main函数的类型设为void。
3.endl是iostream.h中的一个标准符号常量“换行”。
4.利用输入输出流对象进行输入输出时,没有必要说明需输出输入数据的数据类型,系统会根据相关变量,按变量定义时的类型自动处理。(整型数据只能按整型格式输出,而不能按字符类型输出)
5.c++提供的注释方式为//,也支持c的注释方式/* */
1.3 输入、编译、调试和运行一个C++程序
基本步骤与C一样P4,但是继承环境所提供的界面、操作略有不同。
不同点:C源程序文件扩展名为c,C++源程序文件扩展名为cpp
1.4 C++语言的输入与输出命令
一、输入:cin>>v1>>v2>>…>>vn;
1. >>:提取运算符
2.提供数据时,数据间用空格(广义)分开。
3.所提供数据应与变量类型相一致,若不一致,会导致操作失败或数据错误。(感兴趣者可以仔细研究)。
二、输出:cout< 1.<<:插入运算符 2.系统会根据输出数据的类型,自动以相应的格式输出 1.5 程序设计语言的发展 自学 1.6 C++程序的基本要素 1.6.1 标识符、关键词和标点符号 一、标识符:程序中变量、类型、函数和标号的名称 1.区分大小写 2.组成规则,字母(含下划线)开头的字母数字串 二、关键字 关键字:具有特定作用,不能作为自定义标识符的字符组合。 标准标识符:系统提供具有特定功能的常量、函数等,与关键字的区别是,关键字不能作为用户自定义标识符,而标准标识符则可以,但是最好不要将其作为用户自定义标识符。 1.6.2 注释 编译器把一个注释作为一个空格字符处理。 1.6.3 源程序 一个C++源程序由一个或多个源文件构成。 习惯上,通常将变量、类型、宏和类等的定义放在一个源文件中(扩展名用.h),然后在其他源文件中引用这些定义量。在编制大型程序时尤其需要这样,在学习阶段,由于程序很小,所以可以不采用这种方法。 1.7 编译预处理 1.7.1 宏定义 无参宏 格式:#define <宏名> <替换序列> 说明:1.习惯上宏名采用大写字母 2.宏替换是一个机械过程 有参宏 格式:define <宏名> <带有参数的替换序列> 说明:1.有参宏与函数的本质不同 2.为防止宏替换出现问题,最好将参数和整个宏都用括号括起1.7.2 文件包含 格式:#include <文件名> 或#include "文件名" 说明:1.文件包含的作用是将被包含文件嵌入到包含文件中 2.<>在系统指定的目录查找被包含文件;"首先在当前目录中查找,若找不到,再到指定目录查找 采用文件包含的方式,从物理角度是两个文件,但是对于C语言系统而言,仍然是“一个”文件。 1.8 Visual C++的集成开发环境 Visual C++软件包包含了许多独立组件,如编辑器、编译器、链接器、实用程序生成器、调试器。我们运行VC所看到的界面是VC系统所提供的一个叫做Developer Studio的集成开发环境。开发环境会根据用户使用的需要,自动调用一些相应组件。 1.8.1 菜单和工具栏 开发环境提供的界面与windows下的其他软件的界面窗口基本一样,由标题栏、菜单栏、快捷图标栏及编辑窗口和其他窗口等组成。 1.除标题栏外,其他栏目均为停靠式,可以用鼠标拖动改变它们的位臵。 2.快捷图标栏由多种工具栏组成,缺省状态下由标准工具栏(Stdandard Bar),向导工具栏(Wizard Bar),建立(编译)微型栏(Build MiniBar)组成,如果希望在工具栏中出现其它栏目,可以通过工具/定制/工具栏进行有目的的设臵。 1.8.2 Developer Studio窗口 整个集成环境的窗口中有多个窗口,分为两种类型,一种是文档窗口(带边框),多个窗口时以平铺或层叠方式显示;一种是停靠窗口,缺省状态有两个停靠窗口,一个是工作区(Workspace),一个是输出窗口(Output)。其他窗口在需要时会自动出现,或者通过菜单命令,指定显示某个窗口。 1.8.3用Developer Studio编写和调试简单C++程序 编写简单程序的步骤: 1.选择菜单文件(File)/新建(New)中的工程(Projects)选项卡,选择Win32 Console Application(32控制台应用程序。C++开发不同的程序需要选择不同的工程项目,对于简单的编程,选择Win32 Console Application即可。 2.为该工程项目起一个名字,填在右上方project name上。下面的location指明项目文件的存储位臵,用户可自己设定。 3.此时应用程序生成向导会提问要生成的项目类型。选择An empty project(空项目),点击finish、ok。 系统会自动产生目录和一个工作区文件(.dsw),一个.dsp,一个.ncb文件。 4.再次选择菜单文件(File)/新建(New)中的文件选项卡,从中选 择C++ Source File,为该程序文件命名,单击OK。 5.在编辑窗口内编辑程序、编译、调试、运行。 仅编译:compile Ctrl+F7 编译加链接:build F7 执行:execute Ctrl+F5 产生的文件均存放在相应源程序文件下的debug目录中。 1.8.4 菜单选项、快捷键和工具栏 第二章控制结构 教学目的:掌握结构化程序设计方法的基本思想和C++的几种基本控制转移语句,熟悉使用伪代码的编程方法。 重点:C++的控制结构。 难点:分支循环结构 2.1 程序的基本控制结构 结构化的基本结构 结构化的程序设计方法:以模块化设计为中心,将需解决的问题划分为若干个相互独立的模块。 模块的大小 2.2 C++的控制结构 2.2.1 顺序结构 相互间具有先后顺序关系的模块组合 2.2.2 选择结构 1.概念 选择结构又称分支结构。两个模块都有被执行的可能,但每次只能有且只有一个被执行。 2.格式 if (表达式) 语句1 else 语句2 3.注意事项 (1)表达式必须用括号括起 (2)表达式不对类型作任何要求(单变量方式) (3)复合语句的使用 4.应用方式 (1)逐情况判断 (2)假定 (3)嵌套嵌套既可以嵌在then子句上,也可以嵌在else子句上。 注意:为了明确的表示嵌套关系,消除二义性,可以采用三种方法:1)将嵌套嵌在else子句上。 2)写齐所有子句。没有语句的分支可以使用空语句。 3)使用复合语句。 当分支数在3-4个或更多一些,一般使用if语句,若更多时,往往使用switch语句。逐情况法常见于初学者,假定法常用于熟练编程者。嵌套法则是熟练又希望程序比较高效者。 2.2.3 循环结构 1.语句格式 while (表达式) 语句 do 语句 while(表达式); for (表达式1;表达式2;表达式3) 语句 2.语句功能 1)while和for均是当型循环,do while是直到型循环。 2)所有的表达式均对类型没有特定要求。 3)所有的循环体均为一条语句(复合语句)。 4)所有的语句都是当条件成立时运行,不成立时退出。 3.for语句 for语句是C语言中极为灵活的一种语句,当省略第一和第三表达式时,与while语句完全等效。 2.3 结构化程序设计 自顶向下、逐步细化、模块化 2.4 伪代码 类语言,接近语言,但又不是真正的语言,若需要转化成语言时,只要作简单的修改即可。与具体语言相比,语法不像具体语言的要求那么严格。 2.5 结构化程序设计方法简介 解决大型软件生产设计的设计基础和方法。 2.6 C++的其他控制转移语句 2.6.1 switch语句 格式 注意事项 1)switch表达式虽然没有类型要求,但最好不要是实型。 2)case后的常量只能是一个常量表达式。 3)当执行符合条件的分支后,如无break则继续执行下续语句。 4)循环中含switch语句,或switch中含switch,内部的break仅仅自内部 跳出,不能跳出外部控制体。continue只对循环起作用。 2.6.2 goto语句和语句标号 goto语句是无条件转移语句,它可以将程序流程控制无条件地转移到由标号所指定的语句处继续执行。 使用goto构成的结构不一定是非结构化的,但非结构化的程序往往由于goto的因素。 #include "iosteam.h" void main() { int i,j,k=0; for (i=1;i<=10;i++) for (j=1;j<=10;j++) {in:k+=i*j; if (k>100) goto out; } out: cout<<"i="< if (k<500) goto in; } 2.6.3 break语句和continue语句 1.break 作用:中止执行循环,使流程控制退出该循环控制结构,执行该循环语句的下一语句。(还可用于switch,但不能用于使用if构成的循环)虽然break属于非结构化的语句,但它对程序可读性的破坏不严重,某种意义上,还容易提高程序的可读性。 2.continue 作用:仅实现从该语句位臵将流程控制转移到本次循环的结束位臵。它结束的是本次循环,而不是跳出整个循环语句。 几乎所有出现该语句的地方,都可以通过改变算法而取消该语句的使用。 对于多重循环,这两条语句都只能对包含它的语句起作用。 2.6.4 exit()函数和abort()函数 作用:中止整个程序的运行。 exit():结束程序前做一些善后工作。 abort():强制结束程序。 要求使用整数参数表示退出的原因。习惯上用0表示正常退出,非0值表示非正常退出(程序调试)。 2.7 Developer Studio的文本编辑器 一、基本操作 通用的键盘操作方式 二、高级编辑 Windows环境下的一些操作 第三章基本数据类型 教学目的:掌握几种基本数据类型, 包括字符型、整型、长整型、浮点和双精度数据类型的基本概念, 以及常数、变量和数组的使用方法。 重点:C++基本数据类型。 难点:数组 3.1 数据类型 数据类型定义了变量可接受值的集合以及对它所能执行的操作。 类型的定义决定了三个方面的性质: a.该类型数据所占据内存空间的大小(数据的取值范围) b.数据在内存中的存储格式(定点、浮点) c.定义可以施加在该类型数据上的操作 3.1.1 整型数据的表示方法 整型数据在内存中的表示方法(补码),字符型数据也可以认为是补码方式。 3.1.2 实型数据的表示方法 实型数据在内存中的表示方法(浮点数) 3.2 常量 3.2.1 整型常量 十进制:yyy 十六进制:0xyyy 八进制:0yyy 3.2.2 实型常量 格式:±(x).(x)e(E)±xx 规定:小数点先后必须有一位数字 e的左面必须有数字(上面的要求),右面必须是整数 尾数必须为十进制数 说明:c中的实型常量为双精度型,如果需要特别指明为单精度型,可在实数后面加f或F 3.2.3 字符常量 定义:用单引号括起来的一个字符。 c语言支持扩展ASCII字符集,因此共包含256个字符 注意:1.转义ASCII码没有十进制数,只有十六进制和八进制,没有X就是八进制。X打头时不能有0。其取值范围为ff,377 2.任何字符都可以转义方式给出,一些常用控制字符给出了转 义字母,如\n,\t,\b,\\,(\',\"在不引起误解的情况下可以不用\,如 "what's",'"') 3.非转义字母前面加\,\不起任何作用 3.2.4 字符串常量 字符串是用双引号括起来的一系列字符。 注意:当字符串中包含转义字符时,转义符后的数值后面不能跟随引起误解的符号。八进制数后面不能跟0-7,十六进制不能跟0-9和a-f(A-F)。 3.3 变量 3.3.1 变量的声明 1.基本类型 int 整型(4byte)char 字符型(1byte)float 实型(4byte) 验证:cout<<"size="< 注意:不同的语言版本在不同类型的机器上其所占据空间不同 3.类型的前缀 signed unsigned long short 注意:double即为long float 原则: a.不能自相矛盾 short long int b.不能没有实际意义long char、unsigned float 3.3.2 变量的初始化 C++允许在说明变量的同时对变量赋一个初值。 两种格式:int a=3; int a(3); 3.4 数组 1.概念 数组:数组是具有同一类型数据项(数组元素)的有序集合。其所属数据的类型称作基类型或成分类型。数组由一组连续的存储空间构成。 2.数组说明 格式:存储类别类型说明符数组名[常量表达式];[二维] 注意: 1)数组占据的是连续的存储空间 2)下标的取值范围0-n-1 3)允许越界 4)数组名为指针常量,其表示的是地址 5)给定初值时可以省略第一维的下标 3.数组初始化 1)初始化格式 一维数组:int a[5]={1,2,3,4,5}; 二维数组:int b[2][3]={1,2,3,4,5,6}; {{1,2,3},{4,5,6}}; 2)数组的初值 static extern存储类别无初值及初值不足时,无初值元素初值自动为零auto类别无初值时为随机数,初值不足时,无初值元素为零。 3.5 字符型数组和字符串处理库函数 1.概念 字符数组:基类型为字符的数组。 字符串:以双引号括起来的一系列字符(结束标志)。 关系:字符串借助字符数组来存放。 区别:串必定有结束标志,数组不能保证有结束标志;串常量不能以下标方式访问(利用指针指向后可以)。串常量是没有数组名的数组。 2.字符数组的初始化 性质与数值数组一致 格式: char str[10]={'a','b','c'}; {"abc"};"abc"; 省略下标的特殊说明:char str[]={'a','b','c'};无结束标志,下标为>=4的值时则有结束标志。没有初值时为随机字符,所以也没有结束标志。 3.字符数组的输入输出 1)单字符输入输出 以单字符方式读取时,应注意添加结束标志(讲一个读不定长度字符串的例子) 2)以字符串方式输入输出 注意: (1)读取时不需要人为添加结束标志 (2)以空格(广义)为字符串的分隔标志 4.相关的几个函数 strcpy(array,str) strcat(arraystr,str) strcmp(str1,str2) strlen(str) strlwr() strupr() strchr() 字符串中查找字符 strrev() 反转字符串 strstr() 在字符串中查找字符串 说明:array数组(必须有足够的空间),str字符串(数组、常量串、指针) 在C中array可以为指针,VC中只能是数组(教材中有错误) 3.6 类型修饰符和常量修饰符 自学内容 检查验证_intxx方式定义类型的大小 3.7 枚举类型 格式:enum 枚举类型名{枚举元素表}; 说明: ①枚举元素的序号自0开始,按照先后顺序排列,也可指定序号。 指定序号时应预留足够编码空间,若不足,或者系统报错,或者两个元素具有相同的序号。 ②枚举量可以进行比较(如同字符,比较的是它们的序号)。 ③枚举元素是标识符,不是字符串,不能直接以串方式输出,但枚举变量可以直接输出,输出的是该元素的序号。 3.8 typedef语句 1.方法: 1)按定义变量的方法写出定义体 2)将变量名换成类型名 3)在最前面加上typedef 4)用新类型名定义变量 2.说明 类型定义仅仅是为一种类型起了一个别名,并不能产生新的类型。3.9 Develper Studio的文件处理功能 主要讨论了集成环境file菜单的各个菜单的功能 3.10 Visual C++程序的编译、链接和运行 3.11 查看和修改编译、链接错误 第四章表达式 教学目的:熟练掌握C++的各种表达式, 特别是赋值表达式及其他有副作用的表达式。 重点:逻辑运算符和逻辑表达式 难点:运算符的优先级和结合性 总体注意: 1.运算符的书写方法。(与数学运算符的区别) 2.运算符的功能。(单一功能还是多种功能,有没有副作用) 3.运算符的适用对象。 4.运算符的优先级和结合性。 4.1 算术运算符和算术表达式 1.运算符及优先级 +:加-:减*:乘/:除和整除%:取余 */%高于+- 2.运算规则:操作数的类型应当一致,若不一致则需要进行自动的类型转换。 转换规则:字符型和单精度型只要参与运算则自动转换为整型和双精度型,其它类型的转换总是向参与运算的高级别类型转换。 3.注意: ①有符号字符型(含整型)和无符号字符型参与运算对结果的影响。 ②%运算要求运算数据必须为整型(含字符型),当操作数中含有负数时,结果的符号与被除数一致。 ③/运算当操作数均为整型时,为整除运算,否则为除运算。 ④表达式的类型由表达式计算的最终结果决定。 (unsigned) char c=-1; int i; i=2*c; cout< 当c为signed(缺省)时,i的值为-2,当c为unsigned char时,i的值为510。 4.2 逻辑运算符和逻辑表达式 1.运算符 关系:>、>=、<、<=、==、!= 逻辑:&&、||、! 2.运算规则 操作数类型应当一致,若不一致则按照转换规定进行转换,然后进行运算。 关系和逻辑运算的结果为bool型,其值为true(1)或false(0) 3.说明 ①运算级别问题 关系运算符级别不等,==、!=级别低于>、< 逻辑运算符&&和||级别相同(教材有误) int a,b,c,d; a=b=1; c=0; d=a++||b++&&c++; cout<<"a="< 输出为2 1 0 ②尽量避免对实型数进行等于或不等于的判断,如果需要则采用|x-y|<1e-4的方式 ③C语言采用短路算法 当运算不需继续计算即可判断计算结果的时候,可以不再继续后续计算。(简化运算过程) 与运算的前项为假,后项被短路 如:a++&&b++||c++ 当首项为假时,b++被短路,但是c++不能被短路对于全与表达式,第一项为假,后面全部不再计算 或运算的前项为真,后项被短路 如:a++||b++&&c++当首项为真时,b++被短路,c++也被短路 a=1; b=1; c=0; d=a++||b++&&c++; cout<<"a="< 输出为2 1 0 1 按理c++不应当被短路,但是 特例:d=a++||b++&&c++;当首项为真时,后面的计算均被短路。(先或后与,首项为真,后面不算) 若首项为假,将上例a初始为0,则输出结果为1 2 1 0,c++没有被短路。 应用意义:if (n!=0&&m%n==0) 如果不短路将会出现除以零的错误 4.3 赋值运算符和赋值表达式 1.运算符 =、+=等,任何一个双目运算符均可以和“=”结合组成复合运算符。 2.作用 计算赋值运算符右侧表达式的值,将该值写入该变量所对应的存储空间。 3.说明 ①赋值运算符的级别极低(倒数第二)。 ②结合性为自右向左。 4.赋值转换 c语言允许不同类型数据间可以相互赋值,由于他们存储格式和取值范围的不同,在赋值过程中会产生一些问题。 ①字符型与短整型数据的赋值转换 c=s 长送短:截高送低(会引起符号位的变化) s=c 短送长: 无、有正:送低高补0 有负:送低高补1 溢出的处理:对256取余,若大于127,转换二进制,求负数值 2.短整型与整型数据的赋值转换 3.整型与实型数据的赋值转换 f=i 无转换误差 i=f 小数点后截掉(截断误差),超出整型数所能表示范围的溢出(溢出误差) 4.4 自增运算符 1.格式 i++ (++i) 2.作用 在完成参加表达式运算的同时还完成自身的增量操作。 3.分析 i++:先用后增,先参与表达式的计算,然后自身完成增量操作。 ++i:先增后用,先完成自身的增量操作,然后参与表达式的计算。 4.注意 ①i+++j问题:先满足左侧变量的需求(左倾主义) ②在输出语句(实参表)中出现时,按表达式自右向左解释 i=3;cout< 将输出3 3 显然后一个i的值并没有受到前面i++的任何影响。 ③组合增量运算的理解 分析i=3; j=(i++)+(i++)+(i++); tc2.0 vc6.0++: i=6 j=9 tc3.0++: i=6 j=12 若仍然i=3; cout<<(i++)+(i++)+(i++); cout< 输出表达式的值是9,i的值是6,都遵从“先用后增”的原则,采用printf 也是如此,但是如果在TC 2.0和tc3.0++中采用printf时将会是printf("%d",i+++i+++i++); i:6 j:12 再分析i=3; j=(++i)+(++i)+(++i); tc: i=6 j=18 先完成i的三次增量运算,再计算三个i相加 tc++: i=6 j=15 增一个算一个 vc++:i=6 j=16 前两个先增,后面的增一个算一个 tc、tc++:printf("%d",(++i)+(++i)+(++i)); i:6 j:15 vc++仍然是16 再如:(VC) i=3;j=(++i)*(--i); 9 j=(++i)*(--i)*(++i); 36 4.5 表达式中各运算符的运算顺序 在前面的讲述中已讨论,课下自己看看,并琢磨琢磨。 4.6 其他具有副作用的运算符 除了自增运算有副作用以外,赋值语句也有一些副作用,例如: i=3; j=(i=i+2)+(i=8);这类问题不作要求。 4.7 问号表达式和逗号表达式 1.条件运算符 1)结合性问题 教材中为右结合性,实际上为左结合性。 int i=4,j; j=i++>3?i++>4?'L':'R':'N'; 2)和++运算合作问题 ch=a++ tc2.0 vc6.0++: 0 tc3.0++: 1 在关系表达式中出现时,c,vc中视整体为一个表达式。 tc++视关系运算符两侧各为表达式