1、第六讲 基本数据类型与基本运算,6.1 基本类型及其派生类型 6.2 说明语句 6.3 基本运算符,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.1.1 数据类型的概念,任何一个程序从功能上讲都可以概括成数据的输入、数据的加工和数据的输出。因此数据是程序设计的对象和结果,它是程序设计的第一要素。,数据在程序中总是属于一个特定的数据类型。因此,数据类型在程序设计中是一个非常重要的概念。它在一定程度上反应了程序设计语言的优劣。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,类型概念的四个要点,(1)每一项数据应唯一地属于某种类型。,(3)同一类型的数据占用相
2、同大小的存储空间。,(2)每一种数据类型意味着一个有明确定义的值的集合。,(4)同一类型的数据具有相同的运算操作集合。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,C+程序的数据类型可分为三类,(1)基本类型:由系统定义,几乎各种语言都须具备的数据类型。,(2)用户定义类型:由用户根据拟解决问题的数据特征,自行定义的数据类型。,(3)导出类型:由已定义类型以某种确定方式生成的新类型。如数组,结构,指针和引用等类型。(P53.表3.1),6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.1.2 基本类型,三个特征: 由系统定义和提供。 (2) 它们是构造其他
3、数据类型的原点。 (3) 它们是几乎所有程序设计语言都包含的数据类型。,C+语言的基本数据类型:int型、float型、double型、char型、bool型和void型。(P54-55),6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.1.3 派生类型,基本类型经过简单的字长和范 围放大或者缩小,就形成了基本类 型的简单派生类型。,派生类型说明符由int、float、 double和char前加上类型修饰符组 成。 short;long;signed;unsigned; (P56.表3.2),6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.1.4 en
4、um类型,enum类型又称枚举类型,格式为:enum enum:关键字,指明为枚举类型 enum类型名:标识符 枚举值表:逗号分开的多个枚举值。 枚举变量表:可缺省,有则表示变量说明。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,enum类型的五点说明(P57),(1)一个enum类型实际上是int型的子 集,每个枚举值对应一个整数。 (2)设枚举值表含n个枚举值,若全未 赋值时,则自左至右分别对应整数0(n-1)。 (3)若第i个枚举值被赋与整型常量 m,则其右侧未被赋值的枚举值分别 对应m+1,m+2,,直到下个被赋值,6.1基本类型及 其派生类型6.2 说明语句6.3
5、 基本运算符,被赋值的格举值或者表结束。 (4)枚举类型变量只能被赋予枚举值 表中的值。 (5) 枚举类型说明也可以用来说明成 组的整型符号常量。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.1.5 定点类型与浮点类型,上述基本类型和派生类型可划分为两大类:整数类型(定点类型)和浮点类型(实数类型)。,整数类型包括:bool类型、enu m类型、char类型及其派生类型、int类型及其派生类型。,浮点类型包括:float类型及其派生类型double、long double。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.2.1 语句,地位:语句是C
6、+语言的基本功能单元。,C+程序中的语句可划分为4类:,(1)说明语句:程序中所有由程序员给出的名字标识符,包括变量、常量、对象、类、类型、函数、参数等都要在使用前进行说明或者定义。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,(2)表达式语句:也被称为处理语句。它是程序中要求计算机对数据进行处理和操作的语句。C+语言的表达式概念与数据表达式的概念基本一致,但范围有所扩大。如“输入输出语句”、“赋值语句”也都被看成是表达式语句。,(3) 控制语句:用来控制语句执行次序的语句,即是决定下步执行语句的调度者。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,(4
7、) 复合语句和空语句:也被称为块语句或者块,它并非独立的一类语句,而是由“”和“”括起来的若干语句构成的复合语句。空语句是由一个分号“;”构成的语句,不做任何事情。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,常量分为有名常量和字面常量。有名常量的声明必然伴随着字面常量的出现,3.3.2 常量说明,常量:程序执行过程中值不能改变的数据。,例1:有名常量的使用遵循“先声明,后使用”的原则。 const float pai=3.1416;,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,常量说明的目的:给有名常量赋予类型和值。,常量说明语句的格式: const
8、,例2:const int N=2000;const float pai=3.1416;,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,必须以关键字const开头; 类型名:限定为基本类型(int,float, char, bool)及其简单派生类型。 常量名:标识符。 表达式:其值应与该常量类型一致的表达式。,常量要求系统分为其分配内存单元,可将有名常量视为一种只读不写的变量,称为const变量。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,常量定义的另一种方法:宏定义命令。,例3:#define N 1000#define pai 3.1416,使用宏
9、定义命令定义常量时,没有类型和值的概念,系统也不会分其分配相应的内存单元。纯粹是两个字符串之间的替换。一般不推荐使用。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,关键字volatile可将常量说明为可变的。,例4:const int n=1000; /定义常量nvolatile int n; /n变为“可变”,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.2.3 变量说明,变量:程序执行过程中值能改变的数据。,使用:第一次使用时必须先定义。可在一个语句中定义多个变量,但同一语句不能定义不同类型。,变量说明的格式: ;,6.1基本类型及 其派生类型6.
10、2 说明语句6.3 基本运算符,存储类:5种选择 auto:自动变量; register: 寄存器变量; static: 静态变量; extern: 外部变量; 缺省: 按自动变量处理。类型名或类型定义:数据类型说明。 变量名表:该语句定义的变量标识符。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,例5:unsigned short width;width5; /定义后再赋值 或者 unsigned short width5;/定义时直接赋值,初始化:也即为变量赋初值,可在定义后再赋值;也可在定义时直接赋值;但不同类型变量的赋值方法也不同。,6.1基本类型及 其派生类型6.
11、2 说明语句6.3 基本运算符,全局变量和局部变量,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,生存期和作用域,(1)生存期,变量a的生存期是指从a被说明且分配了内存开始,直到该说明语句失去效力,相应内存被释放为止,称为该变量的生存期。,全局变量的生存期指从定义点开始,直到程序结束。,局部变量的生存期指从定义点开始,直到包含它的最近程序块结束。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,(2)作用域,变量a的作用域指的是标识符a可以代表该变量的范围。,作用域一般与生存期一致,但C+语言允许不同程序部分的不同变量使用相同名称,因此变量名的作用域可能会小于
12、其生存期。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,例6: 01: 02: int a, b=5; /变量b的作用域为2-10行 03: /变量a的作用域为2-5行和9-10行 04: iff (a) 05: 06: float a=2.0; /变量a的作用域为6-8行 07: 08: 09: 10: ,在06-08行中整型变量a虽被完好保存,却不被使用。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,变量的存储类属性,变量因存储分配等特征区分为不同的存储类。,C+语言将变量划分为4类:,(1) auto变量:用关键字auto说明的局部变量,称为自动变
13、量。该变量在程序临时工作区中获得存储空间,随变量生存期结束,这段临时空间将被释放。auto属性是变量的缺省存储属性。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,(2) register变量:用register说明的局部变量,将可能以寄存器作为存储空间。但这种说明仅是建议而非强制系统使用寄存器。寄存器不够时,该变量仍按自动变量处理。,(3) static变量:使用static说明的变量,其生存期将持续到程序结束。系统为其在内存分配存储空间,程序运行期间不释放;系统自动为未赋初值的静态变量赋0;不做重复内存分配和赋初值操作。,6.1基本类型及 其派生类型6.2 说明语句6.3
14、 基本运算符,(4) extern变量:使用extern说明的变量,系统不必为其在内存中分配存储空间,因为该变量已在局部之外定义。extern变量多用于由多个文件组成的程序中。当变量在多个文件中被说明,却为同一变量时,就可使用extern变量避免系统重复分配内存。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.2.4 名字空间(namespace),名字空间用于解决大型程序中标识符重名的问题。这是通过将变量、常量、函数、类、对象等根据相互间的逻辑关系分组实现的。每一组被称为一个名字空间。,名字空间的语法格式: namespace,6.1基本类型及 其派生类型6.2 说明语
15、句6.3 基本运算符,名字空间的使用指令: using namespace避免使用名字空间变量时须加名字空间前缀的麻烦。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,例7:名字空间的定义和使用 01 namespace X /定义名字空间X 02 int i,j,k; 03 int k; /全局变量k 04 void f () 05 int j=0; /局部变量j 06 using namespace X; 07 i=52; /X中的变量i 08 X:k=i+4; /X中的变量k 09 j=j+1; /局部变量j,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算
16、符,6.2.5 类型说明,C+语言允许创建3种数据类型:,(1) typedef类型说明:用关键字typedef引导的类型说明语句,可由用户为已定义类型赋予新的类型名。目的是提高程序可读性。其格式为:typedef ,例8: typedef int id_numeber;typedef float temprature;,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,(2) 用户参与定义的新类型说明C+语言规定数据结构的框架和运算规则,由用户定义其细节和类型名。,以enum类型为例,其类型说明格式为:enum;,例9:enum color RED=1, YELLOW, BLU
17、E a=BLUE, b;,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,(3) 完全用户定义的数据类型完整的数据类型包括数据结构、数据取值范围以及该类型允许的运算和操作。,C+语言中的类能够适应程序员定义新数据类型的需要。,三点注意: P66。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,数据(以变量或常量的形式出现)总是具有一个特定的数据类型。那么同一类型的数据将具有相同的操作(运算)集合。,数据可以进行的操作完全由其数据类型决定 。,本节讲的操作是针对基本数据类型的;对于用户自定义数据类型的操作,往往要由程序员自行定义。例如类class中函数成员就是程
18、序员自定义的针对该数据类型的特定操作。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,基本数据类型的操作主要是指一些数学运算和非数学运算。 基本数据的操作表现为由运算符、操作数构成的表达式。 表达式由运算分量和运算符按一定的规则构成,运算符指明所进行运算的类型,表达式经过运算最终得到确定的值。 表达式的值经常用于分支结构中的判断,表达式的值为0时为假,为1时为真。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,每种运算区别于其他运算的是: (1) 参加运算的运算分量的数量和类型。 (2) 运算结果的类型。 (3) 运算的具体操作。,6.1基本类型及 其派生类
19、型6.2 说明语句6.3 基本运算符,6.3.1 赋值运算,赋值运算是一种双目运算。,形式:= 右运算分量为一表达式。 “=”为赋值运算符。 左运算分量为与表达式类型相同的变量。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,赋值运算的操作为: (1) 计算表达式的值; (2) 将该值赋给左端变量。,例10: A=b+c*a s=s+n s+=n,/*复合赋值运算符。把右侧表 达式计算结果加上左端变量再 将和赋给变量*/,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.3.2 算术运算,算术运算是指int型、float型、char型在内的数值类数据计算,结
20、果仍然是同一类型。,主要包括: 单目运算:减(-)、增量(+)和减量(-)。 双目运算:加(+)、减(-)、乘(*)、除(/)和模(%)。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,单目减的形式:-,相当于用-1乘上运算分量的值。,增量运算的形式:前缀增量:+后缀增量:+,运算分量必须是int型或char型。具体操作为令变量值加1。 前缀增量和后缀增量的区别:若将+ +i和i+作为表达式参与其它运算,则前者先令i加1再参与其它运算;而后者先令i参与其它运算再加1。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,减量运算的形式:前缀减量:-后缀减量:-,这
21、两种运算除了将增量运算中的加法改为减法外,和增量运算完全相同。,双目运算的+、-、*、/、%: ,运算分量应为数值类型,结果也为同一类型。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,运算类型的3点说明,(1)两个运算分量应为同一类型,出现不同时应遵循类型转换原则。,由短类型向长类型的自动转换。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,(2)两个int型数据相除,结果应为int型,则运算结果仍为int型。当商不为整数时,须取整。当int型数据和float型数据或者do uble型数据相除时,则运算结果为flo at型或double型。,6.1基本类型
22、及 其派生类型6.2 说明语句6.3 基本运算符,(3) 取模运算符%主要应用于int型数据运算。a%b表示用b除a得到的余数。(P69)对于整数(int型和char型)来说,除法运算和取模运算之间存在如下关系: a-b*(a/b)等价于a%b,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.3.3 关系运算,关系运算是一种双目运算,具体是在计算两个运算分量的值以后对其进行比较操作,若符合运算符指出的关系,则结果为1(true);否则为0(false)。,格式: ,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,C+语言中有6种关系运算符:,小于,大于等于=
23、,等于=,不等!=,左右运算分量都应为数值类型(算术类型)和指针类型的表达式,关系运算符两边类型必须相同。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.3.4 逻辑运算,逻辑运算的具体操作为: (1)分别计算两边的运算分量的值。 (2)以值0为假(false=0或F);以非0为真(true=1或T)。 (3)按不同逻辑运算符计算返回值。,格式: ,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,C+语言中有3种逻辑运算符:,单目运算符:逻辑非! 双目运算符:逻辑与&、逻辑或|,注意:一般逻辑运算的运算分量不取浮点类型,因为在判定浮点数是否为0或者两值是否
24、相等时容易出错。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.3.6 位运算,位运算的具体操作是:对表示整数的二进制编码的每一位进行运算。,格式: (1) (2) (3) 运算分量为相同的int型或者char型及其派生分量;n是移位数;运算结果为整型。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,C+语言中有6种位运算符:,单目运算符:非 双目运算符:按位与&、按位或|、按 位异或、左移、右移。,&、|和使用格式(1)。 使用格式(2)。 使用格式(3)。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.3.7 其它运算,条件运算
25、符; 指针运算符; 逗号运算符; 函数调用符; 字长提取符; 动态分配符;,动态分配符; 数组下标运算符; 限定运算符;,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.3.7.1 条件运算符,条件运算符是三目运算符,格式为: ?:表达式1为数值表达式;表达式2和表达式3为任意表达式。,(1)计算表达式1,如果值为非0(即为真),则转(3); (2)计算表达式3,转4; (3)计算表达式2; (4)完成。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.3.7.2 指针运算符,指针运算符包括两个单目运算符:取地址运算符&和值引用运算符*。 前者的格式为:
26、& 后者的格式为:*,例11: *pb= /&b表示变量b的地址; /*pb表示指针变量pb指向变量b。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.3.7.3 逗号运算符,逗号运算符为“,” 。 格式为:,逗号运算符并未进行实际的数据处理,不过是将程序简明化。(P74),6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.3.7.4 函数调用符,C+语言将函数调用和类型强制转换为归类为表达式。“()”作为运算符的情况有两种:,(1)用于函数调用: (),(2)用于强制类型转换: () 或 () (P74),6.1基本类型及 其派生类型6.2 说明语句6
27、.3 基本运算符,6.3.7.5 字长提取符,C+语言提供的系统函数sizeof,称为字长提取符。格式为: sizeof (),sizeof和一般函数在使用上有两点区别: (1) 运算分量可以是变量名,也可以是类型名。 (2) 当运算分量是变量名时,括号()可省略。运算结果为表示指定变量或类型的字节数的整数。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,sizeof可用于验证系统对于不同类型数据实际分配的内存大小。从而有助于程序员顺利地实现程序移植。 (P75),6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.3.7.6 动态分配符,C+语言提供的动态数
28、据生成运算符new和动态数据释放运算符del ete。格式为:new new sizenew ()delete delete ,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,(1)new运算符用来生成一个无名的动态变量,它返回一个该变量所属类型的指针值,程序使用指针对该变量进行操作。(2)delete运算符用来翻译或者撤销由new生成的动态变量。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.3.7.7 数组下标运算符,C+语言提供的数组下标运算符,格式为: ,具体计算过程是计算下标表达式,并以该值作为下标返回数组的对应元素,其作用相当于变量。因此也被称
29、为下标变量。(P76),6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,6.3.7.8 限定运算符,(1) 作用域限定符“:” 用于类的成员,使用格式为: :在程序中使用类的静态成员时,或在类说明之外定义该类的成员函数时,都需要使用“:”来限定所引用的数据或者函数成员的归属。 用于全局变量或名字空间变量,使用格式为: :a /指明a为全局变量 :,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,(2) 成员选择符“.”和“-”用来限定对象的成员。类的实例(对象)在引用其成员函数时,有两种方式:. -和类的实例有直接关系。(P76),6.1基本类型及 其派生类型6
30、.2 说明语句6.3 基本运算符,6.3.8 运算的优先级,动机:保证每个合法表达式只有唯一正确的计算顺序。,手段:C+语言解决优先问题的方法有3种。 (1) 使用括号():可在表达式中对任意子式使用括号,括号内部分优先计算。 (2) 不使用括号的部分,按优先级顺序计算,优先级高的先计算。(P78 表3.3)。,6.1基本类型及 其派生类型6.2 说明语句6.3 基本运算符,(3) 具有相同优先级的运算符,按两种顺序决定先后次序: 左结合规则:即从左向右依次计算。双目算术运算符、关系运算符、逻辑运算符、位运算符、逗号运算符都采用左结合规则。 右结合规则:即从右向左依次运算。可连续计算的单目运算符、赋值运算符、条件运算符都采用右结合规则。,思考题第2、6、9、12、13。(书面)练习题第1、2、3、4、5。 (上机),作 业,