数据类型的分类
内部类型
优点:
- 基本表示的不可见性
- 编译时能检查变量使用的正确性
- 编译时可以确定无二义的操作
- 精度控制
用户定义类型
- 有限映像:
定义:从定义域类型DT值的有限集合,到值域类型RT值的有限集合的函数(映射)
eg:array[1..50] of char 中整数1至50到字符集的有限映像- 序列:
定义:任意多个数据项组成,数据项称为序列的成分,且类型相同- 判定或:
定义:可以选择不同成员的构造机制
eg:PASCAL的变体记录、C的联合
eg:
变体记录定义如下:
1
2
3
4
5
6
7
8
9 type dept=(house,sports,drugs,food,liquor);
month=1..12;
item=record
price:real;
case available:boolean of
true:(amount:integer;
where:dept);
false:(month_expected:month)
end;实现代码如下:
1
2
3
4
5 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;则空间分配情况如下:
i1
变量名 值 price 5.24 available true amount 29 where liquor i2
变量名 值 price 324.99 available false month_expected 8
- 幂集
定义:类型T的元素的所有子集的集合,T为基类型
C语言的数据类型
非结构类型
内部类型
整型:int、short、long、unsigned
浮点型:float、double
字符型:char(有限字符集的元素)用户定义的非结构类型
枚举:enum
结构类型
数组
结构struct
联合union(C的联合是不安全的)
文件FILE
指针
空类型void
不允许定义空类型变量,可以定义空类型指针变量
类型检查
定义:对数据的操作和对应的类型是否匹配的一致性检查
eg:非法运算、赋值运算、形参实参类型是否匹配
- 静态检查和动态检查
静态检查使程序更有效
动态检查是编程更方便,但是影响了可靠性且降低了执行效率
语言分类
无类型语言:没有数据类型
eg:函数式语言(FP)、泛函程序设计语言(FFP)
弱类型语言:类型检查全部或部分在运行时完成
eg:PASCAL
强类型语言:类型检查都在编译时完成
eg:C、ADA
实现模型
在程序中,数据由常量或变量表示
在实现模型中,数据由描述符(描述数据对象的属性)和数据对象(存储区及其内容)表示
- 内部类型和用户定义的非结构类型:描述符一般由类型描述和指针组成
多个变量的描述符形成变量名表
eg:
1 int numb;
- 结构类型
- 笛卡尔积
各成分按顺序存储,每个成分占整数个存储单元
描述符包含:类型名、构造符、若干三元式(选择符名、域类型、指针)(每个域对应一个三元式)
eg:
1
2
3
4 type t=recode a:real;
b:integer;
end;
var x:t;
- 有限映像
为每一成分分配整数个可编址的存储单元
描述符包括:类型名、构造符、定义域的基类型、下界、上界、成分类型、(每个成分占)单元个数、首地址
eg:
1 type a=array[1..10] of real;
- 序列
可变长串的表示:静态描述符+动态描述符+堆
- 判定或
pascal的变体记录:描述符、数据对象、case表、若干变体描述符
1
2
3
4
5
6 type v=record a:integer;
case b:boolean of
true:(c:integer);
false:(d:integer;
e:real)
end;
指针
表示与内部类型相同只是其值为地址
指针指向的匿名数据对象分配在堆上
编译时所有的描述符保存在一张表中以便编译时使用,甚至有些描述符要保存到运行阶段(数组),并且存储在描述符中的属性可能随运行而变化。