
C++程序设计教程.ppt
360页单击此处编辑母版标题样式,,单击此处编辑母版文本样式,,第二级,,第三级,,第四级,,第五级,,*,返回,,面向对象的程序设计语言--,C++,Welcome to learn C++ !,,讲授:刘韶涛 副教授,,E-,mail:shaotaol@,,,,1,,第一部分,C++,语言基础,,本部分是学习,C++,语言的基础,包括以下几个方面:,,1. C++,概述,,2.,结构化程序设计方法与面向对象程序设计方法的各自特点、区别和相互联系3,.面向对象的程序设计方法中的有关概念,如类、对象、封装、继承、消息和多态性等4,.,C++,程序的基本组成和框架结构5,.掌握,C++,语言中的基本数据类型、各种运算符、表达式6,.,C++,数据输入流对象,cin,和输出流对象,cout,的使用7,.程序的,3,种基本结构,,8,.构造数据类型,如数组、结构体、指针等的定义方法、特点和使用方法9,.函数的定义、调用及函数调用过程中的参数传递的机理和程序执行流程10,.引用的概念及其定义和使用方法2,,1.1 C++,概述,,1.1.1,计算机系统的层次结构,,,,,,,,,应用软件,,,,通 处 理 工,,,用,,作 具,,软 言 系 系 软,,件 语 操,,,,,,裸,机 统 统 件,,,,,计算机系统的层次结构图,3,,1.1 C++,概述,,1.1.1,计算机系统的层次结构,,,任何计算机系统都必须包含硬件和在其上运行的软件。
计算机硬件必须有软件的支持才能有效地运转并为人们所利用计算机硬件系统一般由处理器(控制器和运算器)、存储器、输入设备和输出设备等部分组成一般来讲,人们认为软件系统由系统软件和应用软件两部分组成我们从系统层次的角度,可以把软件分为:,,(,1,)操作系统(,OS,,,Operating System),,,它是计算机软件的核心,是硬件的第一级扩充在它的控制下,计算机的全部资源,如,CPU,、内存、外部设备(,CRT,、打印机,扫描仪、光盘机等)和各种软件资源可以协调一致地工作它可以有条不紊、高效率地管理和调度计算机地硬件设备和各种软件资源,使它们最大限度地发挥作用操作系统还要协调控制许多可能“并发”执行的程序段,按照预先确定的控制策略合理地组织系统的工作流程,提高系统的执行效率,保护系统和用户的信息安全常用的操作系统:,MS-DOS,,,Windows,Unix,等4,,1.1 C++,概述,,(,2,)语言处理系统,,其主要的核心部分是程序设计语言的编译系统程序设计语言是从事计算机的技术人员,特别是软件编写者不可缺少的编程工具,是“驾驶”计算机运行的“方向盘”目前世界上经设计和实现的程序设计语言有上千种之多。
大致可分为两大类,一类是因计算机中央处理器(,CPU,)不同而异的汇编语言,另一类是通用的程序设计语言前者称为低级语言,后者称为高级语言说汇编语言是一种低级语言,是因为计算机硬件是最低层的,而隶属于语言处理系统的汇编语言最接近于硬件,它是在机器码语言的基础上直接发展起来的一种面向机器的低级语言,它的每一条指令与机器码语言的指令保持着一一对应的关系,可方便地对硬件实现控制和操作,能充分发挥硬件的潜力,且用汇编语言编写的程序与高级语言相比执行速度最快5,,1.1 C++,概述,,,从计算机的根本原理来说,计算机只能理解和执行一系列二进制指令码,即由数字,0,和,1,的不同排列组合而成的二进制码对应不同操作的指令,这就是通常所说的“机器码指令”用上述各 种语言(包括汇编语言在内)编写的程序称为“源程序(,Source Program)”,,源程序不能直接在计算机上运行,而必须经过语言处理系统进行“翻译”加工,转换成机器码指令后才能执行常用的语言有:古典语言(,Fortran,、,Pascal,、,Cobol,Basic,等)、人工智能语言(,LISP,,,PROLOG,等)以及现代的语言(,C/C++,,,JAVA,,,Delphi,Powerbuilder,,,C#,等)。
6,,1.1 C++,概述,,关于,C,和,C++,,C,是最靠近机器的通用程序设计语言在最初设计时是作为一种面向系统软件(操作系统和语言处理系统)的开发语言,即用来代替汇编语言的,但是由于它具有强大的生命力,因而在事务处理、科学计算、工业控制和数据库技术等各个方面都得到了广泛的应用即使进入到以计算机网络为核心的信息时代,,C,语言仍然是作为通用的汇编语言使用,用于开发软(件)、硬(件)结合的程序,如实时监控程序、系统控制程序和设备驱动程序等C++,是,C,的面向对象扩展,是面向对象程序设计语言的一个大众化版本,是当前学习面向对象程序设计方法的首选语言C++,是,C,的超集,它保留了,C,的所有组成部分并与其完全兼容,既可以做传统的结构化程序设计,又能进行面向对象程序设计,是当今世界最为流行的面向对象程序设计语言大大型应用软件开发上,以,Windows,开发环境为操作平台的,C++,类库和组件正在迅猛发展,,C++,即将取代,C,已是不可抗拒的事实,它的触角几乎已触及到计算机研究和应用的各个领域完全遵循美国国家标准化组织制定的,ANSI C++,标准,目前广泛流行在微型计算机上使用的,C++,产品,有美国,Microsoft,公司推出的、以,Windows,开发环境为操作系统平台的,Visual C++,,,还有美国,Borland,公司开发的,C++ Builder,等。
7,,1.1 C++,概述,,(,3,)通用软件,,通用软件可分为如下几组:,,(,a,),数据处理类软件:进行数值计算(行列式、矩阵、复变函数等计算)、统计分析、数学表达式分析计算以及模拟处理的程序等b,),进行声音、图形、图像和动画等多媒体信息处理的程序c,),有关自然语言处理、模式识别、神经网络和专家系统等人工智能方面的应用程序d,),计算机辅助设计与制造(,CAD/CAM,)、,计算机辅助教学(,CAI,)、,计算机辅助分析以及决策支持系统等方面的通用程序4,)应用软件,,除通用软件以外的各种应用程序统称为应用软件当前从事应用软件的开发是各类计算机应用专业技术人员的大舞台,这些技术人员既具有扎实的本专业知识,又掌握了计算机的应用知识,很善于把计算机当作工具来完成本应用领域中的各种任务应用领域大致可划分为:科学计算,如天文、气象等大型计算任务;办公自动化(,OA-Office Automation,),,,如,Office 2000,;,数据库技术领域,如,FoxPro,、,Sybase,和,Oracle,等;工业控制领域,产品如,Intouch,等8,,1.1 C++,概述,,,,(,5,)工具软件,,是为协助用户更方便地使用计算机完成开发任务而研制,并集多种功能于一体地支程序软件包。
如,PC Tools,、,FrontPage 2000,、,Cutftp,等等9,,1.2,从面向过程的程序设计到面向对象的程序设计,,1.2.1,传统的结构化程序设计,(,Structured Programming---SP,),方法,,,1,.使用,SP,方法设计程序的步骤,,,,,在数据处理过程中,采用的是自顶向下、分而治之的方法,将整个程序按功能划分为几个可独立编程的子过程模块,每一子模块完成指定的子任务,并且提供一个清晰、严格的调用界面,主过程通过调用各子过程完来成全部处理工作,数据声明,数据处理,结果输出,10,,2,.,SP,方法的特点,,优点:,,(,1,)这种程序设计方法力求算法描述准确2,)对每一子过程模块容易进行程序正确性证明缺点:,,(,1,)这种程序设计方法本质上是面向“过程”的,而“过程”和“操作”又是不稳定和多变的,因此不能直接反映人类求解问题的思路2,)程序代码可重用性差程序中除少数标准库函数外,每设计一个程序时,程序员几乎从零做起即使重用代码,通常也是通过拷贝或编辑重新生成一份3,)维护程序的一致性困难该种方法将数据与对数据进行处理的程序代码分离1.2,从面向过程的程序设计到面向对象的程序设计,,11,,1.2.2,面向对象的程序设计(,Object-Oriented Programming ----OOP,),方法,,,1.,面向对象的有关概念,,面向对象的程序设计方法强调直接以问题域(现实世界)中的事物为中心来思考和认识问题,并按照这些事物的本质特征把它们抽象为对象,以作为构成软件系统的基础。
1,)对象(,Object,),:,每个对象都具有属性(,Attribute,),和方法(,Method,),这两方面的特征对象的属性描述了对象的状态和特征,对象的方法说明了对象的行为和功能,并且对象的属性值只应由这个对象的方法来读取和修改,两者结合在一起就构成了对象的完整描述1.2,从面向过程的程序设计到面向对象的程序设计,,12,,(,2,)类(,Class,):,具有相似属性和行为的一组对象,就称为类可见,有了类的概念以后,就可以对具有共同特征的事物进行统一描述3,)封装(,Encapsulation,):,封装把对象的属性和方法看成了一个密不可分的整体,从而使对象能够完整地描述并对应于一个具体事物,4,)继承(,Inheritance,):,将客观事物进行归类是一个逐步抽象的过程,反之,将类进行层层分类便是一个概念逐渐细化的过程在面向对象的程序设计中,允许在已有类的基础上通过增加新特征而派生出新的类,这称为继承其原有的类称为基类(,base class,),,而新建立的类称为派生类,(derived class),1.2,从面向过程的程序设计到面向对象的程序设计,,13,,(,5,)消息(,Message,):,在面向对象的程序设计中,由于对象描述了客观实体,它们之间的联系通过对象间的联系来反映。
当一个对象需要另外一个对象提供服务时,它向对方发出一个服务请求,而收到请求的对象会响应这个请求并完成指定的服务这种向对象发出的服务请求就称为消息6,)多态性(,Polymorphism,):,多态性是面向对象的另一重要特征在通过继承而派生出的一系列类中,可能存在一些名称相同,但实现过程和功能不同的方法(,Method,)所谓多态性是指当程序中的其他部分发出同样的消息时,按照接收消息对象的不同能够自动执行类中相应的方法其好处是,用户不必知道某个对象所属的类就可以执行多态行为,从而为程序设计带来更大方便1.2,从面向过程的程序设计到面向对象的程序设计,,14,,2.,面向对象的程序设计方法(,OOP,方法),,这种方法将设计目标从模拟现实世界的行为转向了模拟现实世界中存在的对象及其各自的行为在,OOP,中,将“对象”作为系统中最基本的运行实体,整个程序即由各种不同类型的对象组成,各对象既是一个独立的实体,又可通过消息相互作用,对象中的方法决定要向哪个对象发消息、发什么消息以及收到消息时如何进行处理等1.2,从面向过程的程序设计到面向对象的程序设计,,,,方法,数据,消息,消息,15,,3,.,OOP,方法的特点,,(,1,),OOP,以“对象”或“数据”为中心。
由于对象自然地反映了应用领域的模块性,因此具有相对稳定性,可以被用作一个组件去构成更复杂的应用,又由于对象一般封装的是某一实际需求的各种成分,因此,某一对象的改变对整个系统几乎没有影响2,)引入了“类”(,class,),的概念类与类以层次结构组织,属于某个类的对象除具有该类所描述的特性外,还具有层次结构中该类上层所有类描述的全部性质,,OOP,中称这种机制为继承3,),OOP,方法的模块性与继承性,保证了新的应用程序设计可在原有对象的数据类型和功能的基础上通过重用、扩展和细化来进行,而不必从头做起或复制原有代码,这样,大大减少了重新编写新代码的工作量,同时降低了程序设计过程中出错的可能性,达到了事半功倍的效果1.2,从面向过程的程序设计到面向对象的程序设计,,16,,1.2.3,面向对象的程序设计方法与结构化程序设计方法的比较,,(,1,)传统的结构化程序设计方法以过程为中心构造应用程序,数据和处理数据的过程代码是分离的、相互独立的实体,设计出的程序可重用代码少,且当代码量增加时维护数据和代码的一致性困难2,)面向对象程序设计方法中,对象所具有的封装性和继承性使得代码重用成为可能,并大大减少了程序出错的可能性。
3,)面向对象方法吸收了结构化程序设计方法的优点,同时引入了新概念、新机制并建立了比传统方法更高层次的抽象1.2,从面向过程的程序设计到面向对象的程序设计,,17,,1.3.1,从,C,语言到,C++,语言,,,C,语言以其如下独有的,特点,风靡了全世界:,,(,1,)语言简洁、紧凑,使用方便、灵活C,语言只有,32,个关键字,程序书写形式自由2,)丰富的运算符和数据类型3,)可以直接访问内存地址,能进行位操作,使其能够胜任开发操作系统的工作4,)生成的目标代码质量高,程序运行效率高5,)可移植性好1.3 C++,程序的基本组成,18,,1.3 C++,程序的基本组成,,局限性,:,,(,1,)数据类型检查机制相对较弱,这使得程序中的一些错误不能在编译阶段被发现2,),C,本身几乎没有支持代码重用的语言结构,因此一个程序员精心设计的程序,很难为其它程序所用3,)当程序的规模达到一定程度时,程序员很难控制程序的复杂性19,,1.3 C++,程序的基本组成,C++,包含了整个,C,,,C,是建立,C++,的基础C++,包括,C,的全部特征和优点,同时添加了对面向对象编程(,OOP,),的完全支持。
1980,年,贝尔实验室的,Bjarne,,Stroustrup,开始对,C,进行改进和扩充1983,年正式命名为,C++,在经历了,3,次,C++,修订后,,1994,年制定了,ANSI C++,标准的草案以后又经过不断完善,成为目前的,C++,C++,仍在不断发展中美国微软公司现已推出,C#,(,C Sharp,),语言,来代替,C++,语言20,,1.3.2 C++,程序的结构与基本组成,,,一个简单的,C++,程序,是由若干个函数构成的,其中有且仅有一个名称为,main,的函数存在,,下,图说明了,C++,程序的基本框架结构:,1.3 C++,程序的基本组成,,声,,明,,区,,#include,,:,,函数声明,,定义全局变量,主,,程,,序,,区,类型,main(,参数行,),,{,,,程序主体;,,},,函,,数,,定,,义,,区,函数定义,,{,,,函数主体;,,},,21,,1,.,声明区,,,声明区处在程序文件的所有函数的外部1,)包含头文件:如,#include ",iostream.h,",,(,2,),宏定义:如,#define PI 3.1415926,,(,3,),类定义:如,class name{……},;,//,也可以在函数体内,,(,4,),结构体定义:如,struct,record{……},;,,(,5,),函数声明:如,void print(),;,,(,6,),全局变量声明:如,float H=2.58,;,,(,7,),条件编译:如,#,ifdef,……,等。
1.3 C++,程序的基本组成,22,,2,.,主程序区,,主程序以,main(),函数开始,是整个程序运行的入口,该,函,,数中可能包含的内容主要有:,,(,1,)局部变量的声明:如:,int,i=1,;,,(,2,),函数调用:如,:,y=sin(x),;,,(,3,),一般运算:如:,a=b+c+d/3,;,,(,4,),结构控制:如:,if(a>b) c=a,;,,(,5,),对象与结构的处理6,)文件的处理等1.3 C++,程序的基本组成,23,,图,2.3 C++,函数的组成,,,4,.,程序举例,1.3 C++,程序的基本组成,,函,,数,,定,,义,,区,,,函数说明,,,int,,max(int,,a,int,b),,,函数体,,,{,,int,c;,,c=a+b;,,return(c);,,},,3,.,函数定义区,,程序中除了,main,函数之外,还可以包含其它的函数,每个函数是由函数说明和函数体两部分构成的如图,2.3,所示:,24,,1.3 C++,程序的基本组成,,声,,明,,区,,#include <,iostream,>,,using namespace std;,,void print(); //,函数声明,,主,,程,,序,,区,,void main(),,{,int,i;,,char s[80];,,print( );,,cout,<<"What's your name?\n";,,cin,>>s;,,cout,<<"How old are you?\n";,,cin,>>i;,,cout,<
// This is the first C++ program,,/*,C,语言的某些特征仍可沿用,*,/,,#include ",iostream.h,",,void print(); //,函数声明,,void main(),,{,int,i;,,char s[80];,1.3 C++,程序的基本组成,26,,,print( );,,cout,<<“What‘s your name?\n”; //,用,C++,特有的方式输出数据,,cin,>>s;,,cout,<<"How old are you?\n";,,cin,>>i;,,//,验证结果,,cout,<
3,)不管一个程序中有多个函数,只有,main,函数整个程序运行时的入口,程序运行时从此函数开始执行但在程序中,,main,函数所处的位置可以任意4,)一个,C++,的函数是由两部分构成的,即函数的说明部分和函数体,函数的说明部分包括了函数的返回值的类型、函数的名称、圆括号、形参及形参的类型说明函数体由一对大括号,{},括起来,其内容是由若干条语句,1.3 C++,程序的基本组成,28,,构成,函数体的内容决定了该函数的功能5,),C++,对程序中的名称是大小写“敏感”的,除特殊情况下,应一律小写6,)程序中的注释:可以用,/*…………*/,或,//,(单行注释)对程序中的内容进行注释二者的区别在于,,,采用,/*…………*/,方法时,,,注释可以写成多行,,,而采用,//,方法时,,,注释只能写成一行,,,它可单独占一行,,,也可写在某行程序代码的末尾7,)数据输出:除了使用,printf,( ),函数,还可使用功能更强大、更方便的,cout,对象进行输出数据格式如下:,,cout,<<,数据,1<<,数据,2<<……<<,数据,n,,,如:上例中的语句,cout,<
格式如下:,,cin,>>,变量,1>>,变量,2>>……>>,变量,n,,如:上例中的语句,cin,>>s;,表示给变量,s,输入一个值,,(9),在分别使用,cout,和,cin,进行数据的输出和输入时,需要在程序的开头嵌入”,iostream.h,”,文件在该头文件中定义了输入输出流对象,cout,和,cin,等10),一个,C++,的源程序文件在存盘时,要以,.CPP,为文件名后缀,而不是,.C,11,),C++,程序的开发过程,1.3 C++,程序的基本组成,30,,串,“,years old.”,2.2 C++,程序的基本组成,,,,,,,,,,,C++,程序的开发过程,31,,1.4 C++,数据类型、运算符和表达式,2.3.1,数据类型,,(,1,)预定义数据类型(基本数据类型)包括布尔型(,bool,),、字符型、整型、浮点型、无值型四种,其中浮点型又分为单精度浮点型和双精度浮点型两种2,)构造数据类型,包括数组、结构体、共用体(联合)、枚举、类等本节重点介绍,C++,的基本数据类型,有关构造数据类型将在后面章节进行介绍32,,2.3.1.1,基本数据类型,,,1.3 C++,数据类型、运算符和表达式,数据类型,关键字,字节数,数值范围,布尔型,bool,1,,true (,非,0),或,false(0),字符型,char,1,-128,~,127,整 型,int,4,-2147483648,~,2147483647,单精度浮点型,float,4,±(3.4E-38~3.4E38),双精度符点型,double,8,±(1.7E-308~1.7E308,无值型,void,0,valueless,33,,2.3.1.2,类型修饰符,,C++,还允许在基本数据类型(除,void,类型外)前加上类型修饰符,来更具体地表示数据类型。
C++,的类型修饰符包括:,,,signed,有符号,,unsigned,无符号,,short,短型,,long,长型,,,1.3 C++,数据类型、运算符和表达式,34,,数据类型标识符,,字节数,,数值范围,,常量写法举例,,char,1,-128,~,127,‘A’, ‘0’,’\n’,signed char,,,1,,-128,~,127,,56,,unsigned char,,,1,,0,~,255,,100,,short [,int,],,,2,,-32768,~,32767,,100,,signed short [,int,],,,2,,-32768,~,32767,,-3456,,unsigned short [,int,],,,2,,0,~,65535,,0xff,,int,,,,4,,-2147483648,~,2147483647,,1000,,signed,int,,,4,,-2147483648,~,2147483647,,-123456,,unsigned,int,,,4,,0,~,4294967295,,0xffff,,表,2.2 C++,的基本数据类型,,35,,数据类型标识符,,字节数,,数值范围,,常量写法举例,,long [,int,],,4,,-2147483648,~,2147483647,,-123456,,signed long [,int,],,4,,-2147483648,~,2147483647,,-3246,,unsigned long [,int,],,4,,0,~,4294967295,,123456,,float,,4,,±(3.4E-38~3.4E38),,2.35, -53.231,3E-2,double,,8,,±(1.7E-308~1.7E308),,12.354,-2.5E10,,long double,,10,,±(1.2E-4932~1.2E4932),,8.5E-300,,,表,2.2 C++,的基本数据类型,,36,,说明,:,,(,1,)表中带,[ ],的部分表示是可以省略的,如,short [,int,],可以,写为,short,int,,或简写为,short,,,二者的含义是相同的。
2,)四种修饰符都可以用来修饰整型和字符型用,signed,修饰的类型的值可以为正数或负数,用,unsigned,修饰的类型的值只能为正数3,),ANSI C,和,ANSI C++,标准中并没有具体规定各种数据类型的“数据长度”,只要求,long,型,的数据长度不短于,int,型,,short,型不长于,int,型只要遵循标准所给出的这些原则,具体如何实现由各种语言系统自行决定1.3 C++,数据类型、运算符和表达式,37,,1.3 C++,数据类型、运算符和表达式,2.3.1.3,常量,,在,C++,语言中,数据分为常量和变量两大类由于程序中的数据是有类型的,所以常量和变量都是有类型之分的常量按照不同的数据类型可以分为: 字符型常量、整型常量、浮点型常量,以及字符串常量等程序是根据程序中常量的书写格式来区分它,是,哪种类型常量的38,,1.,整型常量,,在程序中书写整型常量时,没有小数部分用户可根据需要分别可以用十进制、八进制和十六进制的形式书写:,,,十进制格式 :,由数字,0,至,9,和正、负号组成,书写时直接写出数字,如:,123,,,-516,,,+1000,等八进制格式 :,以数字,0,开头的数字(,0,至,7,)序列,,0111,,,010007,,,0177777,等。
十六进制格式 :,以,0x,或,0X,开头的数字(数字,0,至,9,、字母,a,至,z,),序列,如,0x78AC,,,0xFFFF,等1.3 C++,数据类型、运算符和表达式,,39,,2.,浮点型常量,,只能用十进,制来,表示可以用小数或指数形式表示,(,缺省为,double,),如:,34.5f,,,.345,,,1.5e-3,,3.,字符型常量,,(,1,)用一对单引号括起来的一个字符,单引号只是字符与其他部分的分割符,不是字符的一部分,并且,不能用双引号代替单引号在单引号中的字符不能是单引号或反斜杠如:,,‘,a,’,,,‘,A,’,,,‘,#,’,,合法的字符常量,,,‘’’,,,,‘,\,’,,非法的字符常量,//,可以‘,\’‘ , ‘\\’,,“,A,”,,不代表字符常量,//,为字符串常量,,(,2,)另一种表示字符常量的方法是使用转义字符C++,规定,采用反斜杠后跟,一个字母,来代表一个控制字符,具有新的含义 1.3 C++,数据类型、运算符和表达式,,40,,C++,中常用的转义字符,//,例 转义字符例,.,cpp,,转义字符,,含义,,ASCII,码值(十进制),,\a,,响铃(,BEL,),,7,,\b,,退格(,BS,),,8,,\n,,换行(,LF,),,10,,\r,,回车(,CR,),,13,,\t,,水平制表(,HT,),,9,,\v,,垂直制表(,VT,),,11,,\\,,反斜杠,,92,,\’,,单引号,,39,,\”,,双引号,,34,,\0,,空格符(,NULL,),,0,,\,ddd,,任意字符,,3,位八进制数,,\,xhh,,任意字符,,2,位十六进制数,,1.3 C++,数据类型、运算符和表达式,41,,4.,字符串常量,,用一对双引号括起来的一个或多个字符的序列称为字符串常量或字符串。
字符串以双引号为定界符,双引号不作为字符串的一部分如:,,“,Hello”,, “,Good Morning!”,,“,I say: \“ Goodbye!\”,”,,,字符串中的字符数称为该字符串的长度,在存储时,系统自动在字符串的末尾加以字符串结束标志,即转义字符,‘,\0,’,//,可以“,hello\0”,,//,串比较的错误方式,.,cpp,,5.,符号常量,,,常量也可用一个标识符来代表,称为符号常量如,:,,#define PRICE 30,,void main(void),,{……},1.3 C++,数据类型、运算符和表达式,42,,使用符号常量应,注意,以下几个方面:,,(,1,)它不同于变量,在作用域内其值不能改变和赋值如:在上例中如再用,PRICE=40;,这一语句进行赋值则是错误的2,)符号常量名一般用大写,而变量名用小写,,,以示区别6.,程序中常量的表示方法,,在程序中的常量有以下三种表示方法:,,(,1,)在程序中直接写入常量,,如,:,-200,,,3.4E-10,‘A’,,‘,1’,,,0x120,,,045,,,5.35,,,1000l,,,int,i; char s; float f;,,i=20; s=’a’; f=2.0F;,1.3 C++,数据类型、运算符和表达式,43,,(,2,)利用,#define,定义宏常量,,一般格式:,#define,宏名 常数,,如:,#define PI 3.14,,…………,,s=2*PI*r;,,…………,,(,3,),利用,const,定义正规常数,,一般格式:,const,,数据类型标识符 常数名,=,常量值;,,说明,:,,① const,必须放在被修饰类型符和类型名前面,,②,数据类型是一个可选项,用来指定常数值的数据类型,如果省略了该数据类型,那么编译程序认为它是,int,,类型,1.3 C++,数据类型、运算符和表达式,44,,如:,const,int,a=10;,表示定义了一个初始值为,10,的整型常量,它在程序中不可改变,但可用于表达式的计算中,.,,//,const,面试题,1.cpp const,面试题,2.cpp,,2.3.1.4,变量,,1,.变量的概念,及特点,,每一变量就相当于一个容器,对应着计算机内存中的某一块存储单元,用于存储程序中的数据。
变量的值具有以下两个特点:,,(,1,)“一充即无”:即将一个新数据存放到一个变量中时,该变量中原来的值消失,变量的值变成了新值如:执行完语句,int,i; i=10; i=20;,后,i,的值为,20,,而不是,10,1.3 C++,数据类型、运算符和表达式,45,,(,2,)“取之不尽”:可将某个变量的值与程序中的其它数据进行各种运算,在运算过程中,如果没有改变该变量的值时,那么,不管用该变量的值进行多少次运算,其值始终保持不变如:语句,int,i,j,k; i=10; j=i+10; k=i+j*5;,其中,,i,的值可无限制地多次使用,但它的值始终保持值,10,,因为在程序中没有改变变量,i,的值2,.定义变量,,程序中的每一变量,都要先定义,后使用定义变量的一般有以下三种格式:,,数据类型标识符 变量名;,,数据类型标识符 变量名,=,初始化值;,1.3 C++,数据类型、运算符和表达式,46,,数据类型标识符 变量名,1[=,初始值,1],,变量名,2[=,初始值,2],,,…,;,,如:,,char a;,,,,//,定义字符型变量,a,,int,i=1000;,,//,定义整型变量,i,,,i,的初始值为,1000,;,,float a=2.0,b=3.0,c; //,定义浮点型变量,a,、,b,、,c,,且,a,、,b,的,,初始值分别为,2,、,3,。
变量名是每个变量的名称,其命名遵循以下规则:,,(,1,)由字母、数字和下划线(,_,)三类符号排列组合形成,且开头字符必须是字母或下划线2,)名称中字符的最大个数是,31,个3,),C++,中区分变量名的大小写1.3 C++,数据类型、运算符和表达式,47,,(,4,)变量名不能和,C++,中的关键字同名,也不能和用户编制的函数或,C++,库函数同名如:,int,, double,或,static,都不能作为变量名5,)变量名尽量做到“见名知意”3,.定义变量的位置,,在程序中的不同位置采用不同的变量定义方式,决定了该变量具有不同的特点变量的定义一般可有以下三种位置:,,(,1,)在函数体内部,,在函数体内部定义的变量称为局部变量,这种局部变量只在进入定义它的函数体时起作用,离开该函数体后该变量就消失(被释放),即不再起作用因此,不同函数体内部可以定义相同名称的变量,而互不干扰如:,,1.3 C++,数据类型、运算符和表达式,48,,void func1(void),,{,int,y;,,y=2;,,},,void func2(void),,{,int,y;,,y=-100;,,},,,在本例中,函数,func1,和,func2,的函数体内部都分别定义了变量,y,,,但它们都只能在各自的函数体内起作用,都是局部变量。
1.3 C++,数据类型、运算符和表达式,49,,(,2,)形式参数,,当定义一个有参函数时,函数名后面括号内的变量,统称为形式参数如:,,int,is_in(char *a, char b),,{ while(*a),,if (*a==b),,return 1;,,else,,a++;,,return 0;,,},,,本例中,函数名,is_in,后面括号内的变量,a,和,b,是该函数的形式参数,它们都只能在该函数体内起作用,是该函数的局部变量1.3 C++,数据类型、运算符和表达式,50,,(,3,)全局变量:,在所有函数体外部定义的变量,其作用范围是整个程序,并在整个程序运行期间有效如:,,#include “,stdio.h,”,,int,count; //,定义,count,变量是全局变量,,void func1(void);,,void func2(void);,,int,main(),,{ count=10;,,func1();,,return 0; },1.3 C++,数据类型、运算符和表达式,51,,void func1(void),,{,int,temp;,,temp=count;,,func2();,,,printf(“count,is %d”, count); / /,输出,10,,},,void func2(void),,{,int,count;,,for(count=1;count<10;count++),,,putchar,(‘.’);,,},,//,赋值语句面试题,2.cpp,1.3 C++,数据类型、运算符和表达式,52,,1.3.2,运算符和表达式,,程序中对数据进行的各种运算是由运算符来决定的,不同运算符的运算方法和特点是不同的,从此可以看出,一个运算式子中要涉及到数据及运算符,而运算符是对数据进行指定操作,并产生新值的特殊符号。
2.3.2.1,算术运算符和算术表达式,,算术运算符就是对数据进行算术运算,如:加、减、乘、除等,是在程序中使用最多的一种运算符,,C++,的算术运算符如表,2.4,所示1.3 C++,数据类型、运算符和表达式,53,,,运算符,,,功能,,,数据类型,,,例子,,,-,,,负号,,,数值,,,x=-y;,,,+,,,加,,,数值,,,z=x+y;,,,-,,,减,,,数值,,,z=x-y;,,,*,,,乘,,,数值,,,z=x*y,,,/,,,除,,,数值,,,z=x/y;,,,%,,,求余,,,整数,,,z=x%y,,,++,,,自加,,,数值,,,z++,或,++z,,表,2.4 C++,的算术运算符,,,,--,,,自减,,,数值,,,z--,或,--z,,算术表达式是指由算术运算符、括号将常量、变量、函数、,圆括号,等连接形成的一个有意义的式子如:,54,,(1+x)/(3*x),,(((2*x-3)*x+2)*x)-5,,3.14*,sqrt(r,),,b*b-4.0*a*c,,注意,:,,(,1,)表达式中的括号不管有多少层,一律使用圆括号2,),在将一个数学上的运算式子写成对应的,C++,的表达式时,要,注意,进行必要的转换。
①,乘号不能省略②,数学表达式中出现的数学运算函数要用,C++,提供的对应的数学运算库函数来代替1.3 C++,数据类型、运算符和表达式,55,,③,要特别注意表达式中两个整型数相除的情况如:有一数学表达式为,2/3(f-32),,,要写成对应的,C++,的表达式时,正确地写法应写,2.0/3.0*(f-32),而不是,2/3*(f-32),,(5/2,得到结果,2,,,5.0/2.0,得到结果,2.5),,2.3.2.2,赋值运算符和赋值表达式,,,赋值运算符的功能将某个数据的值赋给某个变量赋值运算符的用法格式:,,变量名 赋值运算符 常量、变量或表达式,,说明:,,(,1,)被赋值的目标,即赋值运算符左边的量必须是变量,而不能是常量或表达式1.3 C++,数据类型、运算符和表达式,56,,(,2,),C++,中的赋值运算符如表,2.5,所示3,),要注意区分赋值运算符“,=”,与数学上的“等号”间的区别,,如:,,int,x,y; //,定义变量,x,y,为,int,类型变量,,x=10; //,将变量,x,赋成值,10,,,赋值运算符,,例子,,等价形式,,=,,x=x+y,,x=x+y,,+=,,x+=y+z,,x=x+(y+z),,-=,,x-=y+z,,x=x-(y+z),,*,=,,x*=y+z,,x=x*(y+z),,/=,,x/=y+z,,x=x/(y+z),,%=,,x%=y+z,,x=x%(y+z),,1.3 C++,数据类型、运算符和表达式,57,,x=x+20; //,将,x,的值在原值(,10,)的基础上再加上值,20,后,,(结果为,30,)赋给变量,x,,y-=x+5; //,等价于,y=y-(x+5),,x%=y+10; //,等价于,x=x%(y+10),,(,4,),,前增,/,减运算是变量的值先自增,1,或自减,1,,然后以该变量自增或自减后的值参加其它运算;后增,/,减运算是该变量先以原来的值参加其它运算,然后再自增,1,或自减,1,;增减量运算符只能用于变量,不能用于常量和表达式。
如:,7++,;,(i+j)++; //error,1.3 C++,数据类型、运算符和表达式,58,,(,5,)对表达式,x+++y,的理解:是(,x++)+y,还是,x+(++y)?,,C++,规定,处理时从左至右取尽可能多的“,+”,或“,-”,号字符组成一个运算符,将解释为(,x++)+y,编程者最好采用便于阅读和理解的写法,写成(,x++)+y,的形式//i++,面试题,2.cpp i++,面试题,3.cpp i++,面试题,4.cpp,,(6),在,ANSI C,中,增量运算符“,++”,和减量运算符“,--”,只能用于整型量,而在,ANSI C++,中,这两个运算符对整型和浮点型均可使用2.3.2.3,sizeof,运算符,,,,sizeof,运算符功能是求某一数据类型或某一变量在内存中所占空间的字节数其使用的一般形式:,,sizeof,(,变量名或数据类型,),或,sizeof,,变量名或数据类型,,如:,1.3 C++,数据类型、运算符和表达式,59,,#include <,iostream.h,>,,void main(),,{short,int,,aShort,;,,,int,,anInt,;,,long,aLong,;,,char,aChar,;,,float,aReal,;,,,cout,<<"data type\,tmemory,used(bytes)";,,,cout,<<"\,nshort,,int\t,"<<,sizeof(aShort,);,,,cout,<<"\,ninteger,\t"<<,sizeof(anInt,);,,,cout,<<"\,nLong,integer\t"<<,sizeof(aLong,);,,,cout,<<"\,nchar,,achar\t," <<,sizeof(aChar,);,,,cout,<<"\,nfloat,\t"<<,sizeof(aReal,);,,},1.3 C++,数据类型、运算符和表达式,60,,其输出结果为:,,data type memory used(bytes),,short,int,2,,integer 4,,Long integer 4,,char,achar,1,,float 4,,//,sizeof,面试题,1.cpp,,2.3.2.4,关系运算符和关系表达式,,关系运算符就是对两个量之间进行比较的运算符,如表,2.6,所示。
1.3 C++,数据类型、运算符和表达式,61,,由关系运算符将两个表达式连接形成的运算式子是关系表达式,一个关系表达式的值是一个逻辑值,,当为真时,值为,1,,为假时,值为,0,如:假设,a=1,,,b=20,,,c=3,,,则,,a10,,<=,,小于或等于,,(x+y)*2<=100,,>,,大于,,x+y>z,,>=,,大于或等于,,x-y>=a*b+2,,= =,,等于,,x+y==a+b,,!=,,不等于,,x-y!=0,,1.3 C++,数据类型、运算符和表达式,62,,注意,:,,在对两个表达式的值进行是否相等的比较时,要用运算符“,==”,,而不能写成“,=”,2.3.2.5,逻辑运算符和逻辑表达式,,逻辑运算符是对两个逻辑量间进行运算的运算符,如表,2.7,所示1.3 C++,数据类型、运算符和表达式,逻辑运算符,,含义,,例子,,!,,逻辑非,,!(x>10),,&&,,逻辑与,,(i>1) && (i<10),,||,,逻辑或,,c==0 || c==9,63,,,,,由逻辑运算符将两个表达式连接形成的式子叫逻辑表达式。
各种逻辑运算的“真值表”如表,2.8,所示对于参加逻辑运算的操作数,系统认为“非,0”,为真,“,0”,为假而逻辑表达式的结果只能为逻辑真(,1,)或逻辑假(,0,)表,2.8,逻辑运算真值表,,a,,,b,,,a&&b,,,a||b,,,!a,,,!b,,,真,,,真,,,真,,,真,,,假,,,假,,,真,,,假,,,假,,,真,,,假,,,真,,,假,,,真,,,假,,,真,,,真,,,假,,,假,,,假,,,假,,,假,,,真,,,真,,1.3 C++,数据类型、运算符和表达式,64,,注意,:,,(,1,),C,或,C++,中在给出一个逻辑表达式的,最终计算结果值时,用,1,表示真,用,0,表示假,但,在进行逻辑运算的过程中,凡是遇到非零值时就当真值参加运算,遇到,0,值时就当假值参加运算,如:,int,a=10,b=15,c=14;,则(,a+6,),&& (b>c),的值为,1,(真)2,)在逻辑表达式的求值过程中,并不是所有的逻辑运算符都被执行,只是在必须执行下一个逻辑运算符才能求出表达式的值时,才执行该运算符①,a && b && c,只有,a,为真时,才需要判别,b,的值,只有,a,和,b,的值都为真时才需要判别,c,的值。
如:,int,i=10;,则,表达,式,i && (i=0) && (++i),的值为,0,(假),该表达式运算结束后,变量,i,的值为,0,,而不是,1,//i++,面试题,5.cpp,1.3 C++,数据类型、运算符和表达式,65,,②,a || b||c,只要,a,为真,就不必须判断,b,和,c,;,只有,a,为假,才判别,b,;,a,和,b,都为假才判别,c,如:,int,i=1,j;,则表达式,i++||i++||i++,的值为,1,(真),运算结束后,变量,i,的值为,2,,而不是,4,③,对于数学上的表示多个数据间进行比较的表达式,在,C,或,C++,中要拆写成多个条件并用逻辑运算符连接形成一个逻辑表达式如:在数学上,要表示一个变量,a,的值处于,-1,和,-9,之间时,可以用,-9-9 && a<-1,,,而不能写成,-9
因此必须写成,a>-9 && a<-1,的形式1.3 C++,数据类型、运算符和表达式,66,,2.3.2.6,条件运算符,,在,C++,中只提供了一个三目运算符,—,即条件运算符“?:”,其一般形式为:,,表达式,1,?表达式,2,:表达式,3,,条件运算的规则是:首先判断表达式,1,的值,若其值为真(非,0,),则取表达式,2,的值为整个表达式的值;若其值为假(,0,),则取表达式,3,的值为整个表达式的值如:若,a=3,,,b=4,,,则条件表达式,a>b?a:b,的值为,4,//i++,面试题,1.cpp,,2.3.2.7,位运算符,,1,.位运算符及其运算规则,,所谓位运算符是指能进行二进制位运算的运算符C++,提供的位运算符如表,2.9,所示1.3 C++,数据类型、运算符和表达式,67,,,,,,,,位运算的运算规则为:,,(,1,)按位与,&,:两个运算量相应的位都是,1,,则该位的结果值为,1,,否则为,0,;,,(,2,)按位或,|,:两个运算量相应的位只要有一个是,1,,则该位的结果值为,1,,否则为,0,;,运算符,,含义,,例子,,&,,按位与,,i&128,,|,,按位或,,j|64,,^,,按位异或,,j^12,,~,,按位取反,,~j,,<<,,按位左移,,i<<2,,>>,,按位右移,,j>>2,,1.3 C++,数据类型、运算符和表达式,68,,(,3,)按位异或,^,:两个运算量相应的位不同,则该位的结果值为,1,,否则为,0,;,,(,4,)按位取反,~,:将运算量的每一位取反。 5,)按位左移,<<,:将操作数中的每一位向左移动指定的位数,移出的位被舍弃,空出的位补,0,6,)按位右移,>>,:将操作数中的每一位向右移动指定的位数,移出的位被舍弃,空出的位补,0,或补符号位如:,a=5,,,b=6,,,则:,,a 00000101,,,,00000101,,00000101,,b & 00000110,,,|,00000110,,,。
