编译原理第二章

编译原理第二章

引言

什么是数据类型

数据类型实质上是对存储器中所存储的数据进行的抽象。它包含了一组值的集合和一组操作。

数据类型的作用

实现了数据的抽象,从机器的具体特征中解脱出来,提高了编程效率

编译原理第二章

数据类型的分类

  • 内部类型
  • 用户定义类型

内部类型

内部类型的特点

编译原理第二章

内部类型的优越性

  • 基本类型不可见某些动态特性不一定能查出,如i/j中j=0

  • 编译能检查变量使用的正确性

  • 编译时可确定无二意性

  • 精度控制

    精度说明有利于空间优化
    精度说明可作为检查的一种手段
    精度说明有利于程序的修改

用户自定义类型

编译原理第二章

笛卡尔积

编译原理第二章

有限映像

编译原理第二章

编译原理第二章

编译原理第二章

序列

编译原理第二章

递归

编译原理第二章

判断或

编译原理第二章

编译原理第二章

幂集

编译原理第二章

编译原理第二章

C语言的数据类型

编译原理第二章

编译原理第二章

非结构类型

分为内部类型和用户自定义类型
非结构内部类型有整型、实型和字符型

编译原理第二章

聚合构造

数组

实现有限映像
说明的格式
<类型说明符> <数组名> [常量表达式]

编译原理第二章

可以定义多维数组
说明的格式
<类型说明符> <数组名> [常量表达式]…[常量表达式]

编译原理第二章

C语言的数组按行存放
对数组名的处理相当于指针

结构

编译原理第二章

编译原理第二章

联合

编译原理第二章

文件

编译原理第二章

指针

编译原理第二章

空类型

编译原理第二章

抽象数据类型

用户定义类型与内部定义类型的抽象

编译原理第二章

抽象数据类型的定义

编译原理第二章

类型检查

编译原理第二章

静态检查:在编译时的检查

动态检查:在运行时的检查

无类型语言:没有类型的语言

弱类型语言:语言的类型检查不能全部在编译时完成,有些在运行时完成

强类型语言:语言的类型检查全部在编译时完成

类型转换

将一个类型的值转换成另一个类型的值,称为类型转换;
类型转换分为拓展(widening)收缩(narrowing)

扩展:转换之后的类型值的集合包含转换之前的类型值的集合;

例如:
整型->实型

收缩:转换之前的类型值的集合包含转换之后的类型值的集合;例如:
实型->整型

在某些语言中,类型转换的要求和规则是隐式的,它由编译器自动生成类型转换的代码;
一般来说,语言对基本类型提供适当的类型转换,而对复合类型或用户自定义类型不提供转换;

隐式转换发生在下述的情况下:
混合运算:级别低的类型向级别高的类型值转换。
**将表达式的值赋给变量:**表达式的值向变量类型的值转换。
**实参向函数形参传值:**实参的值向形参的值进行转换。
**函数返回值:**返回值向函数返回类型的值进行转换。

类型等价

若T1和T2是两个类型,T1的任何值都可以赋予T2类型的变量,反之亦然,T1类型的实参可以对应类型T2的形参,反之亦然,则称T1和T2是相容的,或等价的;

编译原理第二章

编译原理第二章

两种相容性实现时的比较
①名字等价的实现比较简单
②结构等价的实现需要的模式匹配过程可能十分复杂

实现模型

在实现模型中,数据用描述符和数据对象来表示;描述符用来描述数据对象的所有属性

编译原理第二章

内部类型和用户定义的非结构类型的实现模型

描述符一般由“类型”和一个指针组成

子界的描述符必须包括子界的界值
布尔型和字符型可以压缩存储

编译原理第二章