《东南大学9系信息工程学院《程序设计原理07》.pptx》由会员分享,可在线阅读,更多相关《东南大学9系信息工程学院《程序设计原理07》.pptx(100页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、东南大学计算机科学与工程系1第一页,共100页。1)数据类型概念的早期发展简史2)数据类型 3)强类型(strong typing) 4)Ada的数据类型分类体系5)Ada语言的枚举类型 6)Ada的数值(shz)类型7)Ada的带符号整数类型2第二页,共100页。8) Ada的实数类型9) Ada的浮点数类型10) Ada的定点类型11) Ada的数值类型总结(zngji)12) Ada的数组类型13) 指针类型14) Ada的记录类型3第三页,共100页。n简单说来,数据类型就是(jish)数据对象的分类及该分类上的操作。4第四页,共100页。n指令系统:n 数据传送指令n IN AL,
2、PORT(字节)n IN AX, PORT(字)n 算术(sunsh)运算n MUL 无符号数乘法指令n IMUL 有符号数乘法指令n 5第五页,共100页。符号(fho)扩展指令 CBW(convert byte to word) CWD(convert word to double word) 逻辑运算 AND OR NOT XOR6第六页,共100页。 字符串处理 MOVS( move string) CMPS(compare string) 控制(kngzh)转移 JMP SHORT OPR JMP WORD PTR OPR7第七页,共100页。n数据类型:字节、字、双字、无符号整数、
3、有符号整数、布尔值(值或向量)、字符、字符串n评注:抽象程度低,以原子类型为主,分类不严格(缺乏原则(yunz)、主要基于硬件功能和应用需要)、转换自由(基本在使用者的主观中,缺乏明显的转换标志)8第八页,共100页。n数据(shj)定义伪指令 DB、DW、DDn DATA_BYTE DB 10, 4, 10Hn DATA_WORD DW 100, 100H, -5n DATA_DW DD 3*20, 0FFFDHn MESSAGE DB HELLOn ARRAY DB 100 DUP(?)9第九页,共100页。n结构(jigu)定义伪指令(C语言) n person strucn fname
4、 db First namen lname db last namen month dw ?n day dw ?n year dw ?n person ends10第十页,共100页。n属性(类型)修改操作符 n TYPE variable 返回类型n LENGTH variable 返回分配给该变量的n 单元数n SIZE variable 返回分配给该变量的字节数,n SIZE=LENGTH* TYPE OFFSET variable n 返回变量的偏移(pin y)地址n SEG variable 返回变量的段地址值11第十一页,共100页。n类型(lixng)指定操作符n MOV AX
5、, WORD PTR OPER1+112第十二页,共100页。13第十三页,共100页。n静态、不支持用户定义(dngy)类型n对数值类型支持也十分有限:整数、实数、双精度、复数14第十四页,共100页。n枚举类型、用户定义类型(数组、结构),支持动态数据结构(动态数组、联合),不具备支持抽象数据类型的能力(nngl);n灵活,但理论基础不足,有些方面带有明显的汇编语言的痕迹(数组名同时表示数组第一个元素的地址,结构标志符本身不作为类型区分符使用);标准对类型之间的关系没有详细说明(boolean,numeration),转换比较随意(尤其在指针的问题上, 图 1);15第十五页,共100页。
6、q 类型丰富、全面,支持用户定义类型、抽象数据类型和面向对象概念,具备坚实(jinsh)的理论基础,概念一致、完整,同时提供以上语言中所具有的灵活性q q Ada的类型定义机制 16第十六页,共100页。n用户(yngh)定义类型:subtypen用户(yngh)定义类型:new type; nexample of subtype:n subtype Day_Number is integer range 1.31;n subtype Feb_Day is Day_Number range 1.28;17第十七页,共100页。nsubtype 类似与pascal的子界类型,仅对相应type的值
7、域加以限制,其它方面没有(mi yu)改变,subtype和相应type及同体系中其它subtypes之间进行混合运算时无需显式转换,即从本质上讲,subtype没有(mi yu)创造新的类型。Example of new type type colour is (Red, Amber, Green); type Light is new colour;18第十八页,共100页。type Apples is new Integer;type Oranges is new Integer;No_Of_Apples: Apples;No_Of_ Oranges: Oranges;No_Of_App
8、les := No_Of_ Oranges; No_Of_Apples := Apples (No_Of_ Oranges); Integer(No_Of_Apples) + Integer(No_Of_ Oranges); 19第十九页,共100页。nNew type的作用 nNew type继承parent type的预定义(dngy)操作,用户定义(dngy)的操作(primitive type)(用户定义(dngy)的判等操作除外) 20第二十页,共100页。n简单来讲,数据类型就是对数据对象的分类,分类方式主要是内涵式(少数是外延式)。内涵是对数据对象内在性质(xngzh)(静态、动
9、态)的描述。nexternal domain:问题(wnt)域中的数据类型区分体系;ninternal domain:编译器所能识别的存在于程序中的数据类型分类体系,我们希望该体系能够和external domain建立一一对应的关系,同时编译器也能识别这样的关系,参见图 2 、图 3。21第二十一页,共100页。(名字,结构,值集,属性(shxng)集,操作集) 逻辑(lu j)结构与存储表示 逻辑操作与其实现 用户定义实现,系统实现 22第二十二页,共100页。n强类型概念发展: nST#1(typed):必须为数据对象声明类型。nST#2(typed):每个变量都必须与一类型相联系(li
10、nx),而且,该变量只能存储这一类型的对象。nST#3(strongly typed):nST#4(strongly typed) 23第二十三页,共100页。1)所有的数据对象(变量,值,形参)均属于特定的类型(一般是有名的)。这些类型可以是预定义的或用户定义的。每个数据对象仅属于一种类型。 2)每个变量仅能存储唯一类型的对象。3)一个(y )类型可以有多个变体,该类型的数据对象的变体内容可在运行时确定,程序在处理此类数据对象时,必须对变体部分予以确认。4)在子程序调用过程中,所有实参的类型必须与对应形参的类型相匹配。语言必须对匹配原则做出明确规定。24第二十四页,共100页。union u
11、_tag int ival; float fval; char *sval; u;联合联合25第二十五页,共100页。struct char *name; int flags; int utype; union int ival; float fval; char *sval; u; symtabNSYM;26第二十六页,共100页。1) 满足ST#32) 该语言须有系统、完整的类型体系(tx),对类型间的关系及各种语境下使用类型概念的规则做出合理的规定。3) 该类型体系(tx)及相关规则能够良好地反映问题域的逻辑结构和相关的约束。4) 尽量在静态情况下完整地确定程序中的类型信息,检查出违反类
12、型体系(tx)及相关规则的情况,给出明确的信息;对在动态情况下可能出现的类型错误给予充分的考虑,并予分类,提供预定义错误类型,提供动态检查及异常处理设施。 27第二十七页,共100页。强类型是一个相对的概念。 有一种说法,认为必须在静态条件下检测出所有(suyu)的类型错误才算是强类型的。这是一个历史上的看法。现在看来,这样的定义有失简单与片面。现在的通用语言几乎都提供一些动态的数据类型。28第二十八页,共100页。elementary all types composite access scalar array record (protected task) discrete enumer
13、ation integer signed modular floating fixed decimal ordinary real 29第二十九页,共100页。4.5.1 枚举(mi j)类型举例4.5.2 属性与操作4.5.3 布尔类型 30第三十页,共100页。 type Day is (Mon, Tue, Wed, Thu, Fri, Sat, Sun); type Color is (White, Red, Yellow, Green, Blue, Brown, Black); type Hexa is (A, B, C, D, E, F); 31第三十一页,共100页。1 基于标量类
14、型(lixng)属性的操作2 第一个枚举字面值的位置为0,其后为“1”, TVal(TPos(X)=X TSucc(X)=TVal(TPos(X)+1) 3 关系操作 32第三十二页,共100页。定义:定义: type Boolean is (False,True); type Answer is (False,Dont_Know,True);预定义操作预定义操作枚举枚举(mi j)类型的所有预定义操作类型的所有预定义操作, not , and , xor 33第三十三页,共100页。涉及数值类型的主要(zhyo)问题: 对机器实现的依赖(存储,界限,精度) 34第三十四页,共100页。q 4
15、.7.1 设计(shj)考虑q 4.7.2 例子q 4.7.3 预定义操作35第三十五页,共100页。设计数据类型时的考虑(kol): 范围、精度(for real type),硬件提供的数据类型,效率,可移植性.36第三十六页,共100页。type Page_Num is range 1 . 2_000; subtype Small_Int is Integer range -10 . 10;subtype Buffer_Size is Integer range 0 . Max;37第三十七页,共100页。浮点类型(lixng)和定点类型(lixng)混合运算 38第三十八页,共100页。
16、 type Coefficient is digits 10 range -1.0 . 1.0; type Real is digits 8; type Mass is digits 7 range 0.0 . 1.0E35; subtype Probability is Real range 0.0 . 1.0; -a subtype with a smaller range39第三十九页,共100页。type Volt is delta 0.125 range 0.0 . 255.0; type Fraction is delta System.Fine_Delta range -1.0
17、. 1.0;type Money is delta 0.01 digits 15; decimal fixed point40第四十页,共100页。基本定义(范围、精度、表示方法),类型转换机制Numeric Type Conversion 如果整数(zhngsh)之间的转换, 只需转换类型标记(要检查约束)。实数之间的类型转换的原则是保证精度。实数向整数(zhngsh)转换的过程主要是取整的过程。 41第四十一页,共100页。数组元素: 具有相同(xin tn)的类型数组索引: 任意离散类型 42第四十二页,共100页。大多数语言中,数组下标局限于整数类型,这种局限缺乏理论上的依据。Ada语
18、言中,数组的下标可以是任意(rny)离散类型。我们通过一些例子来看看这种约束的解除带来的便利。43第四十三页,共100页。Hours_Worked: array(Day) of Float;For D in Workday loop Hours_Worked(D) := 8.0;End loop;Hours_Worked(Sat) := 0.0;Hours_Worked(Sun) := 0.0;44第四十四页,共100页。Work_Day: constant array(Day) of Boolean := (True, True, True, True, True,False, False)
19、;Tomorrow: constant array(Day) := (Tue, Wed, Thu, Fri, Sat, Sun, Mon);45第四十五页,共100页。nExamples of object declarations with array type definitions(anonymous): Grid : array(1 . 80, 1 . 100) of Boolean;Mix: array(Color range Red . Green) of Boolean;A, B: array(1 . 80, 1 . 100) of Boolean;a shorthand 0fA
20、: array(1 . 80, 1 . 100) of Boolean;B: array(1 . 80, 1 . 100) of Boolean;A:=B;-illegalA, B: Grid;A:=B; -legal46第四十六页,共100页。n可见正常情况下匿名类型的变量是无法和程序中的其它变量发生(fshng)联系的,所以,在Ada语言中变量正常使用的前提是必须为它声明有名类型。nAnonymous type and named type的使用原则,该原则也适用于其它类型的问题。47第四十七页,共100页。n 动态(dngti)数组:n N: integer:=;n Inverse :
21、Matrix(1 . N, 1 . N); n - N need not be static48第四十八页,共100页。n C语言中Array类型(lixng)(和函数类型(lixng))不能作为函数的返回类型(lixng)。49第四十九页,共100页。narray作为整体参加(cnji)操作nSlice & slidingn S: String(1 . 7) := “BARBARB”n S(4 . 7) := S(1 . 4)50第五十页,共100页。n对multidimensional arrays采用row-major order。在与其它语言(如Fortran)混合(hnh)编程时,可
22、以采用适当的pragma提示编译器改用column-major order。51第五十一页,共100页。class Teststatic void Main() int a1 = new int 1, 2, 3;int, a2 = new int, 1, 2, 3, 4, 5, 6;int, a3 = new int10, 20, 30;int j2 = new int3;j20 = new int 1, 2, 3;j21 = new int 1, 2, 3, 4, 5, 6;j22 = new int 1, 2, 3, 4, 5, 6, 7, 8, 9;52第五十二页,共100页。n4.13
23、.1 指针概念、指针空挂与垃圾回收(hushu)n4.13.2 C语言的指针类型 n4.13.3 Ada的access typen4.13.4 C#语言的内存管理机制53第五十三页,共100页。n 指针也是一种变量,其值是另一个变量的地址。n 空挂n 当某个对象已经(y jing)不存在,而到达它的路径依然存在时,该路径即被挂空。n (本质上是一个生命期的问题)54第五十四页,共100页。 垃圾(l j)回收 当到达某个对象的所有路径均已消失,该对象即无法使用,该对象所占有的空间应该作为垃圾(l j)被回收 55第五十五页,共100页。n指针空挂和垃圾回收是两个相对的概念。n指针空挂和垃圾回收
24、的后果是不同的。垃圾不及时回收仅仅是消耗系统资源而已,在资源耗尽之前(zhqin)不会造成软件运行的错误,而指针空挂会很快导致软件运行错误。n一般来说垃圾回收是操作系统的任务,解决指针空挂是语言的任务。56第五十六页,共100页。 C语言本身(bnshn)没有提供避免指针空挂的措施,没有考虑垃圾回收问题。 指针在C语言中使用非常广泛,部分原因是指针有时是表达计算的最佳方法,部分原因是指针通常比其它方法可以生成更加高效、紧凑的代码。57第五十七页,共100页。C语言中和指针使用有关(yugun)的编码规范形式:形式: 1. 条目条目 2 . 告 警告 警 ( g o j n g ) 级 别级 别
25、 (error/warning/informational) 3. 理由理由 4. 实例实例 58第五十八页,共100页。1 不要修改指向未释放内存的指针不要修改指向未释放内存的指针告警级别:告警级别:Warning。理由:可能会引起内存泄漏。对于堆变量的使用,理由:可能会引起内存泄漏。对于堆变量的使用,我们采用以下约定:用于申请内存的那些指针我们采用以下约定:用于申请内存的那些指针代表该内存块,这些指针不可以被修改,最后代表该内存块,这些指针不可以被修改,最后这一块内存必须且只能这一块内存必须且只能(zh nn)通过这个指通过这个指针释放;那些由其它指针赋值或取对象地址得针释放;那些由其它指
26、针赋值或取对象地址得到的指针被认为是中间变量式的指针,他们不到的指针被认为是中间变量式的指针,他们不代表相应的地址,我们也不用他们释放内存。代表相应的地址,我们也不用他们释放内存。59第五十九页,共100页。 2 禁止使用不代表内存块的指针释放内存禁止使用不代表内存块的指针释放内存告警级别:告警级别:Error。理由:如果理由:如果(rgu)使用不代表内存块的指针释放内使用不代表内存块的指针释放内存可能引起内存的不完全释放、越界释放、指针空存可能引起内存的不完全释放、越界释放、指针空挂、重复释放等问题。挂、重复释放等问题。 3 从堆中申请的内存应该保存起始地址从堆中申请的内存应该保存起始地址告
27、警级别:告警级别:Error。理由:如果理由:如果(rgu)不保存会引起内存丢失,因为我不保存会引起内存丢失,因为我们无法释放该内存。们无法释放该内存。 例如:例如: p = new Xn + 2; 一种改进方法是:一种改进方法是: q = new Xn; p = q+2; 60第六十页,共100页。 4 尽量不要重复使用一个指针申请内存尽量不要重复使用一个指针申请内存(ni cn)(虽然每次重复申请前都进行了释放。)(虽然每次重复申请前都进行了释放。)告警级别:告警级别:Informational。理 由 : 为 了 使 每 块 堆 空 间 有 明 确 的 代 表 指 针理 由 : 为 了
28、使 每 块 堆 空 间 有 明 确 的 代 表 指 针(custodial pointer)我们建议一般不要使用一个)我们建议一般不要使用一个指针重复申请内存指针重复申请内存(ni cn)(建立链表过程除外)。(建立链表过程除外)。 5 堆变量作用域结束时要释放相应的内存堆变量作用域结束时要释放相应的内存(ni cn)告警级别:告警级别:Warning。理由:如果堆变量作用域结束时没有释放相应的内存理由:如果堆变量作用域结束时没有释放相应的内存(ni cn),可能引起内存,可能引起内存(ni cn)泄漏。泄漏。 61第六十一页,共100页。 6 禁止将在内层申请禁止将在内层申请(shnqng)
29、的堆变量地址传给的堆变量地址传给外层外层告警级别:告警级别:Error。理由:将在内层申请理由:将在内层申请(shnqng)的堆变量地址传给外的堆变量地址传给外层可能引起指针空挂。层可能引起指针空挂。 7 memcopy和和memmove中,源指针和目标指针的中,源指针和目标指针的有效类型(有效类型(effective type)要兼容。)要兼容。告警级别:告警级别:Warning。 8 memcopy和和memmove中最好整体操作中最好整体操作(第三个第三个参数的值等于源指针指向的对象的大小参数的值等于源指针指向的对象的大小)告警级别:告警级别:Informational。理由:向目的地址
30、拷贝(移动)时,一般为整体操作,理由:向目的地址拷贝(移动)时,一般为整体操作,如果只有拷贝(移动)一部分,需要在文档中注如果只有拷贝(移动)一部分,需要在文档中注明。明。 62第六十二页,共100页。 9 禁止内存越界使用告警级别:Error。理由:内存越界使用会引起非法操作异常,目前只能检测静态可识别的内存越界。 10 禁止向指针对象传送大小超过其申请(shnqng)范围的对象(一般来说是过大的数组)告警级别:Error。63第六十三页,共100页。 11 禁止将内层自动变量的地址传给外层指针禁止将内层自动变量的地址传给外层指针(包括两种情况,一种是以参数(包括两种情况,一种是以参数(cn
31、sh)形式传回,另一种是通过形式传回,另一种是通过return语句传出语句传出去)。去)。告警级别:告警级别:Error。理由:会引起指针空挂,因为内层声明的自理由:会引起指针空挂,因为内层声明的自动变量在返回外层时自动释放,这样当外动变量在返回外层时自动释放,这样当外层再使用那个地址时就引起指针空挂。层再使用那个地址时就引起指针空挂。 64第六十四页,共100页。 12 禁止将一自动变量的地址赋给一静态变量禁止将一自动变量的地址赋给一静态变量告警级别:告警级别:Error。理由:将一个自动变量的地址赋值给一个静态变量理由:将一个自动变量的地址赋值给一个静态变量容易引起地址空挂。因为当函数返回
32、时,静态变容易引起地址空挂。因为当函数返回时,静态变量还会存在,而自动变量将消逝,这样静态变量量还会存在,而自动变量将消逝,这样静态变量所指的变量已经释放,从而引起指针空挂。所指的变量已经释放,从而引起指针空挂。 13 禁止向指针或数组名赋负整数禁止向指针或数组名赋负整数告警级别:告警级别:Error。理由:内存不可能为负地址。理由:内存不可能为负地址。 14 禁止取数组的地址禁止取数组的地址告警级别:告警级别:Error。理由:这种操作理由:这种操作(cozu)一般来说没有意义。一般来说没有意义。65第六十五页,共100页。 15 远、近指针相互转换远、近指针相互转换告警级别:告警级别:Wa
33、rning。理由:可能会丢失或得到错误的地址信息。理由:可能会丢失或得到错误的地址信息。 16 取寄存器变量的地址取寄存器变量的地址告警级别:告警级别:Error。理由:寄存器不在内存理由:寄存器不在内存(ni cn)寻址范围内。寻址范围内。 17 禁止没有左值的取地址操作禁止没有左值的取地址操作告警级别:告警级别:Error。理由:一元操作理由:一元操作&必须有一个左值放在赋值号的左边用必须有一个左值放在赋值号的左边用来存放地址。来存放地址。 66第六十六页,共100页。1 不要修改指向未释放内存的指针不要修改指向未释放内存的指针2 禁止使用不代表内存块的指针释放禁止使用不代表内存块的指针释
34、放内存内存3 从堆中申请的内存应该保存起始地从堆中申请的内存应该保存起始地址址4 尽量不要重复使用一个指针申请内尽量不要重复使用一个指针申请内存(虽然每次重复申请前都进行了存(虽然每次重复申请前都进行了释放。)释放。)5 堆变量堆变量(binling)作用域结束时要作用域结束时要释放相应的内存释放相应的内存6 禁 止 将 在 内 层 申 请 的 堆 变 量禁 止 将 在 内 层 申 请 的 堆 变 量(binling)地址传给外层地址传给外层7 memcopy和和memmove中,源指中,源指针 和 目 标 指 针 的 有 效 类 型针 和 目 标 指 针 的 有 效 类 型(effectiv
35、e type)要兼容。)要兼容。8 memcopy和和memmove中最好整中最好整体操作体操作(第三个参数的值等于源指第三个参数的值等于源指针指向的对象的大小针指向的对象的大小)9 禁止内存越界使用禁止内存越界使用10 禁止向指针对象传送大小超禁止向指针对象传送大小超过其申请范围的对象(一般来说过其申请范围的对象(一般来说是过大的数组)是过大的数组)11 禁止将内层自动变量的地址传禁止将内层自动变量的地址传给外层指针给外层指针12 禁止将一自动变量的地址赋禁止将一自动变量的地址赋给一静态变量给一静态变量13 禁止向指针或数组名赋负整禁止向指针或数组名赋负整数数14 禁止取数组的地址禁止取数组
36、的地址15 远、近指针相互转换远、近指针相互转换16 取寄存器变量的地址取寄存器变量的地址17 禁止没有禁止没有(mi yu)左值的取左值的取地址操作地址操作67第六十七页,共100页。4.13.3 Ada的access type68第六十八页,共100页。n 灵活性n一致性 69第六十九页,共100页。access type access to subprogram general pool specific access to object access to variable access to variable access to constant 70第七十页,共100页。pool-
37、specific access types and storage pool例:type Ref_Int_A is access Integer;type Ref_Int_B is access Integer;RA: Ref_Int_A := new Integer(10);RB: Ref_Int_B := new Integer(20);RA.all := RB.all;RA := RB; -illegal71第七十一页,共100页。n每一个pool specific access type对应一个pool,该类型的access variable都在且仅在该pool中申请空间。n当程序运行
38、超过了该类型的作用域时,将该pool中的所有object同时(tngsh)释放。72第七十二页,共100页。nPool specific access type也实行按名等价,所以,要真正使用pool specific access type必须首先声明有名的类型说明。nAccess variable的声明必须在相应的pool specific access type的声明之后,也就是说,这些access variable的作用域不可能(knng)超出相应的pool specific access type的作用域。73第七十三页,共100页。n当程序运行超出(choch)某pool spec
39、ific access type的作用域时,也必然超出(choch)了该类型的access variable的作用域,这时,该pool中的所有objects都不可用,也没有用了,当然可以释放。n当程序运行没有超出(choch)该作用域时,不释放pool中的动态对象,当然也就不会出现对象释放了但是引用路径(指针)没有释放的情况,即不会出现指针空挂现象。74第七十四页,共100页。n该方式(fngsh)没有对每个动态object进行及时释放,会造成少量的垃圾没有及时回收的情况。但是由于一般一个模块中申请的动态对象不会太多,所以此法不会造成严重问题。事实上,在军方的嵌入式系统中(一般硬件资源都比较紧
40、张),该方法没有遇到明显的资源浪费问题。75第七十五页,共100页。 general access types, whose values can designate the elements of any storage pool, as well as aliased objects created by declarations rather than allocators, and aliased subcomponents of other objects(前提(qint)是必须在该component的说明前加aliased)76第七十六页,共100页。n The basic rul
41、e is that the lifetime of an accessed object must be at least as long as that of the access object.n各模块之间的调用关系形成了一个动态的层次嵌套关系,同一层的变量(binling)具有相同的生命期。77第七十七页,共100页。n这样,我们对变量(binling)生命期的比较就转换为对变量(binling)所在的模块的当次执行所在的层次的比较。n于是,我们要求被引用对象所在的层次应该处于引用对象(指针)的外层或者同层。基于这种意义,我们把模块执行中的动态层次关系叫做引用层次(access leve
42、l).78第七十八页,共100页。nAda语言要求在引用类型变量(指针)赋值和引用类型转换的过程中检查源操作数和目标操作数的access level。n当access type作为形参时必须是匿名(nmng)类型。nAccess level信息在引用类型变量赋值时的传递。n为了实现静态检查,将规则改为:The basic rule is that the lifetime of an accessed object must be at least as long as that of the access type.79第七十九页,共100页。1.procedure Main is2.Typ
43、e AI is access all Integer;3.Ref1: AI;4.begin5. declare6. Ref2: AI;7. I: aliased Integer;8. begin9. Ref2 := I Access;10. Ref1 := Ref2;11. end;12.13. declare14. - - s o m e o t h e r variables15. begin 16. Ref1.all := 0;17. end;18.end main; 80第八十页,共100页。1.declare2.type AI is access all Integer;3.I: a
44、liased Integer;4.RefI: AI := IAccess;5.begin6.7.declare8. type AJ is access all Integer;9. J: aliased Integer;10. RefJ: AJ := JAccess;11. begin12. 13. RefI := AI(RefJ); -illegal14. 15. end;16.17.end;81第八十一页,共100页。从以上分析可以看出,间接引用对象的消亡(其所占用空间的释放)由系统实现,这样大大减轻了程序员的负担,而且可以有效(yuxio)避免诸如指针空挂及反复释放同一存储空间等问题。8
45、2第八十二页,共100页。nunckecked_deallocation 83第八十三页,共100页。n不同的Pool specific type之间不允许,ngeneral access type之间: 他们所指对象之间静态match; 目标(mbio)类型的life_time必须no greater than 源类型。nPool specific to general access type: yes, vice, no.84第八十四页,共100页。nC#语言(yyn)的值类型和引用类型n C# supports two kinds of types: value types and re
46、ference types. Value types include simple types (e.g., char, int, and float), enum types, and struct types. Reference types include class types, interface types, delegate types, and array types. 85第八十五页,共100页。n值类型的变量中直接存放该变量的数据,引用类型的变量中存放对其它对象(duxing)的引用。两个引用类型的变量可能指向相同的对象(duxing),这样对一个引用变量的操作也就影响了另
47、一个引用变量。对于值类型的变量来讲,每一个变量仅仅代表它自己,对一个值变量的操作不会影响到其它的变量。86第八十六页,共100页。n通俗地讲,多个引用(ynyng)变量可能代表的是同一份拷贝,而每个值变量仅仅代表它自己的拷贝。n或者说,对于引用(ynyng)变量才存在别名问题,而值变量并不存在别名问题。87第八十七页,共100页。using System;class Class1public int Value = 0;class Teststatic void Main() int val1 = 0;int val2 = val1;val2 = 123;Class1 ref1 = new C
48、lass1();Class1 ref2 = ref1;ref2.Value = 123;88第八十八页,共100页。Console.WriteLine(Values: 0, 1, val1, val2);Console.WriteLine(Refs: 0, 1, ref1.Value, ref2.Value);The output of the program isValues: 0, 123Refs: 123, 123 89第八十九页,共100页。n对于引用类型的对象,在安全模式下不需要程序员自己去释放,而是由系统采用(ciyng)引用计数机制去释放。90第九十页,共100页。n4.14.1
49、 Examples n4.14.2 legality rules n4.14.3 Record Representation Clauses 91第九十一页,共100页。n1 数据类型的概念是如何(rh)随着程序设计语言的发展而发展的?n2 强类型系统中数据类型设计的理想目标是什么?你所了解的各个程序设计语言离这个目标有多远?n3 理解强类型概念的相对性,你所了解的各个程序设计语言达到了哪个强类型层次?复习题92第九十二页,共100页。n4 介绍你所熟悉的一种程序设计语言的数据类型体系,将其与Ada语言的数据类型体系进行(jnxng)比较。n5 介绍你所熟悉的一种程序设计语言的用户定义数据类型
50、设施和数据类型兼容规则,将其与Ada语言进行(jnxng)比较。n6 名词解释:n type, subtype复习题93第九十三页,共100页。7Ada语言的枚举数据类型是怎样(znyng)实现抽象语义与具体实现的分离的?它的类型转换规则如何?你认为定义这种转换规则的依据何在?Ada语言的枚举数据类型与C语言的枚举数据类型相比在概念性和灵活性方面如何?复习题94第九十四页,共100页。n8Ada语言(yyn)的各类数值类型的表示能力、操作、兼容及转换规则?n9简要介绍Ada语言(yyn)的数组类型(下标、数组元素、分类、类型兼容性)。n10. 某些语言(yyn)中无标志的变体记录类型有何缺陷?