收藏 分享(赏)

编译第02章.ppt

上传人:tkhy51908 文档编号:9598576 上传时间:2019-08-17 格式:PPT 页数:116 大小:1.01MB
下载 相关 举报
编译第02章.ppt_第1页
第1页 / 共116页
编译第02章.ppt_第2页
第2页 / 共116页
编译第02章.ppt_第3页
第3页 / 共116页
编译第02章.ppt_第4页
第4页 / 共116页
编译第02章.ppt_第5页
第5页 / 共116页
点击查看更多>>
资源描述

1、第二章 数据类型,数据类型实质上是对存储器中所存储的数据进行的抽象。数据类型包含一组值和一组操作。,本章内容,1、将类型作为数据结构的抽象表示可以分为三个层次的抽象,即内部类型、用户定义类型和抽象数据类型 2、数据类型与编译有关的几个问题 3、类型的实现模型,2.1 引言,1. 数据类型的作用 实现了数据抽象 从机器的具体特征中解脱出来 提高了编程效率,语言的某种特定的数据抽象受到两个因素的影响:语言所面向的机器(只提供定点运算或同时提供浮点运算);语言所面向的应用领域。,2. 数据类型的分类 内部类型 自定义类型,语言根据所面向的机器和应用定义了不同的数据类型,这些类型称为内部类型(语言定义

2、类型 )。自Pascal 语言开始,语言提供了由用户定义类型的方法。采用这类方法由用户自己定义的数据类型称为用户定义类型(自定义类型)。,2.2 内部类型,一. 内部类型的特点 .反映基本硬件特性 .在语言级, 同一类型数据的操作使用共用的抽象表示(如+、-、*、/),1. 基本表示的不可见性基本位串对程序员是不可见的。25+9 结果34基本表示00011001+00001001结果 00100010,二. 内部类型的优越性,从而具有优点:不同的程序设计风格可写性可读性可修改性。,2.编译时能检查变量使用的正确性能够进行静态类型检查如 非法运算;形、实参类型匹配,3. 编译时可以确定无二义的操

3、作 超载(多态) :运算符的意义依赖于操作数的类型。“+”可以表示整数或实数加 编译时,拒绝混合运算,或提供类型转换指令 合理地使用超载,可以提高可读性和可用性,4. 精度控制可以通过数据类型显式定义数据的精度 float double,2.3 用户定义类型,语言除内部类型外,还允许用户借助于语言提供的数据的组合(聚合)机制,自己定义新的数据类型。 许多语言允许程序员规定基本数据对象的聚合(乃至聚合的聚合),1. 笛卡尔积n个集合A1,A2,An的笛卡儿积: A1A2An 它是一个集合,其元素是有序的n元式(a1,a2,an),例,一个正多边形用一个整数(正多边形边数)和一个实数(边的长度)来

4、描述,那么任意正多边形都是笛卡儿积 integerreal 的一个元素。,笛卡儿积:Pascal语言的记录C语言的结构,2. 有限映像定义:从定义域类型DT值的有限集合,到值域类型RT值的有限集合的函数(映射)称为有限映像。array150 of char整数1至50到字符集的有限映像,值域对象通过下标选取 下标越界会出错,动态检查 SNOBOL4的ARRAY构造符不要求值域集的所有元素是同一类型的(异质数组),DT到相应值的特定子集的绑定策略:.编译时绑定 (静态数组 C).对象建立时绑定 (半动态数组 ALGOL).对象处理时绑定 (动态数组 APL),任意多个数据项组成,数据项称为该序列

5、的成分,且类型相同 串是序列 顺序文件的思想也是来自序列的概念,只能顺序读写,3. 序列,若数据类型T包含属于同一类型T的成分-递归类型。 允许在类型定义中使用被定义类型的名字 指针是建立递归数据对象的重要手段,4. 递归,一个选择对象结构的构造机制,规定在两个不同选择对象之间作出适当的选择。每一选择对象结构称为变体。 PASCAL的变体记录; C的联合。,5.判定或,类型T的元素所有子集的集合,称为幂集, T称为基类型。若语言缺乏集合类型,只好使用链表或其他机制来实现。,6. 幂集,语言允许程序员利用数据聚合机制,定义复杂的数据对象。 语言允许程序员利用数据聚合机制,定义以复杂的数据对象作为

6、基本项的聚合。,struct student char name48;int age; ;,匿名记录 var a: record x:integer; y:array110 of charend; 显式命名 type complex=record radius:real; angle:realend;var c1,c2,c3:complex;,匿名类型,用户定义类型显式命名的优点: 可读性 (选择名字) 可修改性 (不修改变量说明) 可分性 (重复使用) 一致性检查,可分性,可分性概念用得比较普遍,C语言的函数就使用了可分性。把程序中相同的代码“分离”出来,用一个名字来标识,待使用这段代码时,

7、通过该名字调用该段代码即可。,2.4 PASCAL类型结构,一.非结构类型 内部类型integer,real,boolean,char 2. 有序类型 每一元素都有唯一的前驱和后继如:整型,布尔型,字符型,3. 定义新的有序类型的方法 枚举型 其值不能直接读/写 子界型 动态检查范围,type color=(red,yellow,green,white);traffic=redgreen; 子界var light:color;night:=succ(green); 有序,例:,1. 数组构造构造符ARRAY定义有限映象arrayt1 of t2t1是定义域类型(有序类型)t2是值域类型,二.

8、聚合构造,type row=array59 of real; var my:array38 of row; 或 var my:array38,59 of real;,PASCAL可定义多维数组,2. 记录构造构造符RECORD定义笛卡尔积记录可以整体访问(赋值)用圆点“.” 作为选择符访问单个的域(分量、成分、字段),记录结构的一般形式为 record field_1 : type_l;field_2 : type_2;field_n : type_n end,PASCAL的变体记录,type dept=(house,sports,drugs,food,liquor);month=112;it

9、em=recordprice:real;case available:boolean oftrue:(amount:integer; where:dept);false:(month_expected:month)end;,var i1,i2:item:i1.price:=5.24; i1.available:=true;i1.amount:=29; i1.where:=liquor;i2.price:=324.99; i2.available:=false;i2.month_expect:=8;,price,available,amount,where,5.24,true,29,liquor

10、,price,available,month_expected,324.99,false,8,i1,i2,使用变体记录不安全 同一存储区实际上可能对应两个不同的变体,i1.price:=5.24; i1.available:=true;i1.amount:=29; i1.where:=liquor; i1.available:=false; i1.month_expect=?,SET构造符构造受限制的幂集 基类型只能是有序类型,type vegetable=(bean,cabbage,celery,lettuce,onion,mushroom,zucchizi); var my_salad,l

11、eftover:set of vegetable;,3. 集合构造,PASCAL文件是任意类型元素的序列PASCAL文件仅能顺序处理 put和get进行写/读操作,type pattern=record end;tape=file of pattern; var t1,t2:tape;,4. 文件构造,指针可引用匿名数据对象 空指针的使用 指针的操作:赋值,比较 PASCAL指针只能指向匿名数据对象,三. 指针,type tree_ref=binary_tree_node; 二叉树binary_tree_node=record info:char;left,right:tree_refend;

12、pointer= node; 线性表node=recorddata:integer;next:pointerend;,指针例子,四. 小结(P36图2-4),2.5 ADA类型结构,自学,2.6 C类型结构,一. 非结构类型 1. 内部类型 整型:int,short,long,unsigned 实型又称为浮点型,float,double 字符型数据的值是有限字符集的元素。,浮点型数据范围,类型 占字节数 数值的有效位 数据范围float 4 7 位 -10381038double 8 1516 位 -1030810308阶的范围 分别为 -3838 -308308,思考,最接近于0的正的dou

13、ble数为?,C语言没有布尔型。0表示false,非0表示true。,思考,C语言为什么没有布尔类型?,2. 用户定义类型 枚举类型实例enum boolfalse,true; 默认元素从0开始对应,可以显示改变顺序enum boolfalse=1,true=2;,1. 数组 数组构造实现有限映像 int intarr5; 下标从0开始 二维数组按行存放, float farr34; 可以定义多维数组 对数组名的处理相当于指针,二. 聚合构造,int a10;int *pa;pa=a; 等价于 pa=,例子,构造符struct支持笛卡尔积struct student char name20;

14、/聚合的聚合char sex; char addr30; ;struct student wenyu; /定义结构变量,2. 结构,结构变量不能整体输入和输出。对其中的各个成分分别进行操作。可以把一个结构变量直接赋值给另一个结构体变量内存中,各个成员变量依次存储C的结构体可以嵌套,struct date int m;int d;int y; struct student char name20; char sex; struct date birthday; wenyu; 引用时可以依次找到最低一级的成员 wenyu.birthday.day = 12;,构造符union(联合、共用体)支持判

15、定或 联合把不同类型的变量存放在同一段内存单元中 C的联合是不安全的。,3. 联合,union data int i;char c;float f;;,C语言把文件看成一个字符序列 文件是由字符(字节)数据顺序组成的 文件FILE是由语言预定义的 有丰富的文件操作,4. 文件,指针是C语言的第3类数据类型。 指针可用来构造结构数据,支持递归 没有空指针,可以对指针赋0值表示空 指针可用来定义递归类型的数据,三. 指针,struct Pointer int data;struct Pointer * next;struct Pointer * head;,空类型是C语言的第4类数据类型 不允许定

16、义空类型变量 若函数的返回类型为void,则表示该函数没有返回值 可以定义空类型指针变量,其值是地址 该地址对应存储单元的数据类型不确定,四. 空类型void,C语言不支持用户定义类型构造机制的幂集。,C数据类型小结,第七节 抽象数据类型,1.用户定义类型与内部类型的异同 都建立某种基本表示的抽象内部类型:对二进制位串的抽象;用户定义类型:对内部类型和已定义的用户定义类型的数据作为基本表示的抽象,每一类型都关联一组操作 内部类型隐蔽了基本表示,不能 对它的成分进行操作; 而用户定义类型具有更高级别的抽象,可以对其成分进行操作。,满足下述特性的用户定义类型称为:抽象数据类型 在定义该类型的程序单

17、元中,建立与有关的基本操作; 对使用该类型的程序单元而言,该类型的表示是隐蔽的。,2. 抽象数据类型,自学 了解,一. SIMULA 67的类机制,自学 了解,二.CLU的抽象数据类型,三. ADA语言的抽象数据类型,自学 了解,自学 了解,四. Modula 2语言的抽象数据类型,类class支持 封装(信息隐蔽)继承多态,五. C+的抽象数据类型,类定义的一般形式为,class private:数据声明;函数定义;protected:数据声明;函数定义;public:数据声明;函数定义; ;,被封装和隐蔽的部分包括私有段和保护段所有成员(函数与数据)、公有段函数的实现,类外不可见(保护成员

18、可以在派生类中可见) 类外可见部分是公有段的函数和数据,数据封装是相对的只是对类外而言 类内,所有成员都是可见的(无封装),类的实例是对象 多态性:一个函数名可以标识不同的函数;一个运算符可以代表多种运算; C的继承性是通过派生实现,第八节 类型检查,1. 类型检查对数据的类型和使用的操作是否匹配的一致性检查称为类型检查。,2. 静态检查和动态检查静态检查使程序更正确,更有效动态检查使编程方便,但影响了可靠性,且降低了执行效率,语言可以按类型进行分类。可分为无类型语言弱类型语言强类型语言,无类型语言,一个语言没有任何数据类型,则称为无类型语言。如函数式语言FP和泛函程序设计语言FFP,3.强类

19、型、弱类型语言,一个语言的所有类型检查都在编译时完成-强类型语言(C、ADA) 。若类型检查全部或部分要在运行时完成-弱类型语言(PASCAL),4. PASCAL是弱类型语言,不能确定过程参数参数类型 子界不能静态检查 变体记录的标识符可以在运行时改变 没有严格规定类型的一致性规则,第九节 类型转换,某种类型的值转换为另一种类型的值。,1.语言应该提供类型转换机制隐式(自动)转换显式(强制)转换,2.两种转换方式,拓展:转换之后的类型值集合包含转换之前类型值的集合(整型实型)收缩:若转换之前类型值集合包含转换之后类型值的集合(实型整型),在某些语言中,类型转换的要求和规则都是隐式的-FORT

20、RAN 语言;在某些语言中,类型转换的要求和规则都是显式的-ADA语言。在某些语言中,类型转换的要求和规则有隐式、显式的两类-C语言。,隐式转换发生在下述的情况下: 混合运算:级别低的类型向级别高的类型值转换。 将表达式的值赋给变量:表达式的值向变量类型的值转换。 实参向函数形参传值:实参的值向形参的值进行转换。 函数返回值:返回值向函数返回类型的值进行转换。,3. 注意语言规定的转换规则,第十节 类型等价,Tl和T2是两个类型T1的任何值都可以赋予 T2的变量,反之亦然;T1实参可对应 T2形参,反之亦然, 则 T1和T2类型等价 (相容) 。,两种类型等价 (的变量),1. 名字等价两个变

21、量的类型名相同。 2. 结构等价两个变量的类型具有相同的结构。验证:用用户定义类型的定义来代替用户定义名,重复这一过程,直到没有用户定义类型名为止。,type t=array120 of integer; var a, b : array120 of integer;c : t; d :record a : integer; b : t end,3. 两种相容性实现时的比较名字等价的判断比较简单结构等价的判断需要模式匹配过程可能比较复杂,第十一节 实现模型,在实现模型中,一个数据用描述符和数据对象来表示,而不使用实际的数据结构。 以PASCAL为例。,描述符:描述数据对象的属性 数据数据对象(

22、存储区及其值),一. 内部类型和用户定义的非结构类型 描述符一般由类型描述和一个指针组成,如整数类型描述符 数据对象,integer,2. 子界的描述符必须包括子界的界值 3. 布尔型和字符型可以压缩存储,1. 笛卡尔积 各成分顺序排列 描述符包含:类型名、构造符、若干三元式(选择符名,域类型,指针)每个域对应一个三元式,二. 结构类型,每个成分占整数个可编址的存储单元(字编址或字节编址,) 可以用packed显式说明压缩存储,数据对象,浮点值,定点值,type t=record a:real;b:integer;end;,为每一成分分配整数个可编址的存储单元 描述符包括类型名、构造符、定义域

23、的基类型下界、上界、成分类型(每个成分占)单元个数、首地址,2. 有限映象,描述符,数据对象,浮点值,浮点值,浮点值,type a=array110 of real;,地址公式的计算 若定义域类型是子界mn,每个元素占k个存储单元,那么,按照 k*(i-m)计算ai从首地址b到所分配的存储之间的位移。ai的地址可以写成 b+k*(i-m)= b-k*m+k*i = b+ k*i其中, b= b-k*m 是编译时能计算出的,可变长串的表示:静态描述符+动态描述符+堆,3. 序列,判定或类型的变量分配的空间应足以容纳需要最大空间的变体的值 PASCAL的变体记录的表示包括描述符、数据对象case表

24、、若干变体描述符,4. 判定或,type v=record a:integer;case b:boolean oftrue:(c:integer);false:(d:integer;e:real)end;,v,variant record,a,integer,b,boolean,(false),(true),d,integer,e,real,c,integer,定点值,布尔值,true,false,case表,描述符,数据对象,变体描述符,变体描述符,对幂集可以通过访问的存储空间(例如机器字)来有效地实现。若在某个集合S中出现基类型的第i个元素,那么与 S 相关联的字的第i个位置为“1”。,5

25、. 幂集,两个集合联合通过它们相关联的字的“或”操作来实现交集通过“与”操作来实现。,指针变量的表示类似于内部类型,只是其值为地址。它指向的匿名数据对象分配在堆上,6. 指针,描述符中的类型指向另外的描述符,7. 层次结构数据结构对象的表示,type t1=array03 of integer;t=record a:real;b:t1;c:integerend;,t,record,a,real,b,c,integer,浮点值,定点值,定点值,定点值,定点值,定点值,type t4=array05 of integer;t2=array02 of t4;,t2,array,integer,0,2,6,定点值,类型t4 的每个 成分6 个单元,在编译时将所有描述符保存在一张表(参见13章)中,以便编译时使用。 有些描述符需要保存到运行阶段,而且存储在描述符中的属性可能随运行而变化。,第二章习题,所有习题均为思考题,

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 企业管理 > 管理学资料

本站链接:文库   一言   我酷   合作


客服QQ:2549714901微博号:道客多多官方知乎号:道客多多

经营许可证编号: 粤ICP备2021046453号世界地图

道客多多©版权所有2020-2025营业执照举报