《东南大学9系信息工程学院《程序设计原理07》31804.pptx》由会员分享,可在线阅读,更多相关《东南大学9系信息工程学院《程序设计原理07》31804.pptx(101页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第四章第四章 数数 据据 类类 型型(补充补充)程序设计语言原理程序设计语言原理东南大学计算机科学与工程系1数据类型的设计、实现与语义数据类型的设计、实现与语义1)数据类型概念的早期发展简史2)数据类型3)强类型(strongtyping)4)Ada的数据类型分类体系5)Ada语言的枚举类型6)Ada的数值类型7)Ada的带符号整数类型2数据类型的设计、实现与语义数据类型的设计、实现与语义8)Ada的实数类型9)Ada的浮点数类型10)Ada的定点类型11)Ada的数值类型总结12)Ada的数组类型13)指针类型14)Ada的记录类型34.1数据类型概念的早期发展简史数据类型概念的早期发展简史
2、n简单说来,数据类型就是数据对象的分类及该分类上的操作。44.1.1基本指令系统中的类型因素基本指令系统中的类型因素n指令系统:数据传送指令INAL,PORT(字节)INAX,PORT(字)算术运算MUL无符号数乘法指令IMUL有符号数乘法指令54.1.1基本指令系统中的类型因素基本指令系统中的类型因素符号扩展指令CBW(convertbytetoword)CWD(convertwordtodoubleword)逻辑运算ANDORNOTXOR64.1.1基本指令系统中的类型因素基本指令系统中的类型因素字符串处理MOVS(movestring)CMPS(comparestring)控制转移JMP
3、SHORTOPRJMPWORDPTROPR74.1.1基本指令系统中的类型因素基本指令系统中的类型因素n数据类型:字节、字、双字、无符号整数、有符号整数、布尔值(值或向量)、字符、字符串n n评评注注:抽象程度低,以原子类型为主,分类不严格(缺乏原则、主要基于硬件功能和应用需要)、转换自由(基本在使用者的主观中,缺乏明显的转换标志)84.1.2汇编语言中的类型汇编语言中的类型n数据定义伪指令DB、DW、DDDATA_BYTEDB10,4,10HDATA_WORDDW100,100H,-5DATA_DWDD3*20,0FFFDHMESSAGEDBHELLOARRAYDB100DUP(?)94.1
4、.2汇编语言中的类型汇编语言中的类型n结构定义伪指令(C语言)personstrucfnamedbFirstnamelnamedblastnamemonthdw?daydw?yeardw?personends104.1.2汇编语言中的类型汇编语言中的类型n属性(类型)修改操作符TYPEvariable返回类型LENGTHvariable返回分配给该变量的单元数SIZEvariable返回分配给该变量的字节数,SIZE=LENGTH*TYPEOFFSETvariable返回变量的偏移地址SEGvariable返回变量的段地址值114.1.2汇编语言中的类型汇编语言中的类型n类型指定操作符MOVA
5、X,WORDPTROPER1+1124.1.2汇编语言中的类型汇编语言中的类型评评注注:n复合(聚集)类型能力有所提高,但其中的数组类型没有明确化;n开始支持用户定义类型;n地址概念是类型的核心概念,占有等量存储空间的类型就兼容;n类型转换显式化,但缺乏语义上的约束;n出现属性的雏形。134.1.3FORTRAN语言语言n静态、不支持用户定义类型n对数值类型支持也十分有限:整数、实数、双精度、复数144.1.4C语言语言n枚举类型、用户定义类型(数组、结构),支持动态数据结构(动态数组、联合),不具备支持抽象数据类型的能力;n灵活,但理论基础不足,有些方面带有明显的汇编语言的痕迹(数组名同时表
6、示数组第一个元素的地址,结构标志符本身不作为类型区分符使用);标准对类型之间的关系没有详细说明(boolean,numeration),转换比较随意(尤其在指针的问题上,图1);154.1.5Adaq类型丰富、全面,支持用户定义类型、抽象数据类型和面向对象概念,具备坚实的理论基础,概念一致、完整,同时提供以上语言中所具有的灵活性qAda的类型定义机制164.1.5.1Ada的类型定义机制的类型定义机制n用户定义类型:subtypen用户定义类型:newtype;nexampleofsubtype:subtypeDay_Numberisintegerrange1.31;subtypeFeb_Da
7、yisDay_Numberrange1.28;174.1.5.1Ada的类型定义机制(续)的类型定义机制(续)nsubtype类似与pascal的子界类型,仅对相应type的值域加以限制,其它方面没有改变,subtype和相应type及同体系中其它subtypes之间进行混合运算时无需显式转换,即从本质上讲,即从本质上讲,subtype没有没有创造新的类型。创造新的类型。Example of new type type colour is(Red,Amber,Green);type Light is new colour;18typeApplesisnewInteger;typeOranges
8、isnewInteger;No_Of_Apples:Apples;No_Of_Oranges:Oranges;No_Of_Apples:=No_Of_Oranges;-wrong-wrongNo_Of_Apples:=Apples(No_Of_Oranges);-OK-OKInteger(No_Of_Apples)+Integer(No_Of_Oranges);-OK-OK4.1.5.1Ada的类型定义机制的类型定义机制(续续)19NewTypeVs.ParentTypenNewtype的作用qNewtype继承parenttype的预定义操作,用户定义的操作(primitivetype)(用
9、户定义的判等操作除外)204.2数据类型数据类型n简单来讲,数据类型就是对数据对象的分类,分类方式主要是内涵式(少数是外延式)。内涵是对数据对象内在性质(静态、动态)的描述。nexternal domain:问题域中的数据类型区分体系;ninternal domain:编译器所能识别的存在于程序中的数据类型分类体系,我们希望该体系能够和external domain建立一一对应的关系,同时编译器也能识别这样的关系,参见参见图 2、图 3。214.2.1数据类型概念的组成数据类型概念的组成(名字,结构,值集,属性集,操作集)逻辑结构与存储表示 逻辑操作与其实现 用户定义实现,系统实现 224.3
10、强类型(强类型(strongtyping)n强类型概念发展:1)ST#1(typed):必须为数据对象声明类型。2)ST#2(typed):每个变量都必须与一类型相联系,而且,该变量只能存储这一类型的对象。3)ST#3(stronglytyped):4)ST#4(stronglytyped)234.3.1强类型强类型ST#31)所有的数据对象(变量,值,形参)均属于特定的类型(一般是有名的)。这些类型可以是预定义的或用户定义的。每个数据对象仅属于一种类型。2)每个变量仅能存储唯一类型的对象。3)一个类型可以有多个变体,该类型的数据对象的变体内容可在运行时确定,程序在处理此类数据对象时,必须对变
11、体部分予以确认。4)在子程序调用过程中,所有实参的类型必须与对应形参的类型相匹配。语言必须对匹配原则做出明确规定。24unionu_tagintival;floatfval;char*sval;u;联合联合25structchar*name;intflags;intutype;unionintival;floatfval;char*sval;u;symtabNSYM;带联合的结构带联合的结构264.3.2强类型强类型ST#41)满足ST#32)该语言须有系统、完整的类型体系,对类型间的关系及各种语境下使用类型概念的规则做出合理的规定。3)该类型体系及相关规则能够良好地反映问题域的逻辑结构和相关
12、的约束。4)尽量在静态情况下完整地确定程序中的类型信息,检查出违反类型体系及相关规则的情况,给出明确的信息;对在动态情况下可能出现的类型错误给予充分的考虑,并予分类,提供预定义错误类型,提供动态检查及异常处理设施。27强类型是一个相对的概念。有一种说法,认为必须在静态条件下检测出所有的类型错误才算是强类型的。这是一个历史上的看法。现在看来,这样的定义有失简单与片面。现在的通用语言几乎都提供一些动态的数据类型。284.4Ada的数据类型分类体系的数据类型分类体系elementary all types composite access scalar array record(protected
13、task)discrete enumeration integer signed modular floating fixed decimal ordinary real 294.5Ada语言的枚举类型语言的枚举类型4.5.1枚举类型举例4.5.2属性与操作4.5.3布尔类型304.5.1枚举类型举例枚举类型举例type Day is(Mon,Tue,Wed,Thu,Fri,Sat,Sun);typeColoris(White,Red,Yellow,Green,Blue,Brown,Black);typeHexais(A,B,C,D,E,F);314.5.2属性与操作属性与操作1基于标量类型属
14、性的操作2第一个枚举字面值的位置为0,其后为“1”,TVal(TPos(X)=XTSucc(X)=TVal(TPos(X)+1)3关系操作324.5.3布尔类型布尔类型定义:定义:typeBooleanis(False,True);typeAnsweris(False,Dont_Know,True);预定义操作预定义操作枚举类型枚举类型的所有预定义操作的所有预定义操作,not,and,xor334.6Ada的数值类型的数值类型涉及数值类型的主要问题:q对机器实现的依赖(存储,界限,精度)344.7带符号整数类型带符号整数类型q4.7.1设计考虑q4.7.2例子q4.7.3预定义操作354.7.
15、1设计考虑设计考虑设计数据类型时的考虑:范围、精度(forrealtype),硬件提供的数据类型,效率,可移植性.364.7.2例子例子typePage_Numisrange1.2_000;subtypeSmall_IntisIntegerrange-10.10;subtype Buffer_Size is Integer range 0.Max;374.8Ada的实数类型的实数类型浮点类型和定点类型混合运算384.9浮点类型浮点类型typeCoefficientisdigits10range-1.0.1.0;typeRealisdigits8;typeMassisdigits7range0.
16、0.1.0E35;subtypeProbabilityisRealrange0.0.1.0;-asubtypewithasmallerrange394.10定点类型定点类型typeVoltisdelta0.125range0.0.255.0;typeFractionisdeltaSystem.Fine_Deltarange-1.0.1.0;FractionLast=1.0-System.Fine_DeltatypeMoneyisdelta0.01digits15;decimalfixedpoint404.11Ada的数值类型总结的数值类型总结基本定义(范围、精度、表示方法),类型转换机制Num
17、ericTypeConversion如果整数之间的转换,只需转换类型标记(要检查约束)。实数之间的类型转换的原则是保证精度。实数向整数转换的过程主要是取整的过程。414.12数组类型数组类型数组元素:具有相同的类型数组索引:任意离散类型424.12.1例子例子大多数语言中,数组下标局限于整数类型,这种局限缺乏理论上的依据。Ada语言中,数组的下标可以是任意离散类型。我们通过一些例子来看看这种约束的解除带来的便利。43Hours_Worked:array(Day)ofFloat;ForDinWorkdayloopHours_Worked(D):=8.0;Endloop;Hours_Worked(
18、Sat):=0.0;Hours_Worked(Sun):=0.0;44Work_Day:constantarray(Day)ofBoolean:=(True,True,True,True,True,False,False);Tomorrow:constantarray(Day):=(Tue,Wed,Thu,Fri,Sat,Sun,Mon);45匿名类型匿名类型nExamples of object declarations with arraytypedefinitions(anonymous):Grid:array(1.80,1.100)ofBoolean;Mix:array(Colorra
19、ngeRed.Green)ofBoolean;A,B:array(1.80,1.100)ofBoolean;ashorthand0fA:array(1.80,1.100)ofBoolean;B:array(1.80,1.100)ofBoolean;A:=B;-illegalA,B:Grid;A:=B;-legal46n可见正常情况下匿名类型的变量是无法和程序中的其它变量发生联系的,所以,在Ada语言中变量正常使用的前提是必须为它声明有名类型。nAnonymoustypeandnamedtype的使用原则,该原则也适用于其它类型的问题。匿名类型匿名类型474.12.2动态数组动态数组n动态数组:
20、N:integer:=;Inverse:Matrix(1.N,1.N);-Nneednotbestatic48补充说明补充说明nC语言中Array类型(和函数类型)不能作为函数的返回类型。494.12.3操作操作narray作为整体参加操作nSlice&slidingS:String(1.7):=“BARBARB”S(4.7):=S(1.4)50n对 multidimensional arrays采 用 row-majororder。在与其它语言(如Fortran)混合编程时,可以采用适当的pragma提示编译器改用column-majororder。4.12.4实现实现51C#语言的数组类型
21、:语言的数组类型:rectangulararrays,jaggedarray.classTeststaticvoidMain()inta1=newint1,2,3;int,a2=newint,1,2,3,4,5,6;int,a3=newint10,20,30;intj2=newint3;j20=newint1,2,3;j21=newint1,2,3,4,5,6;j22=newint1,2,3,4,5,6,7,8,9;524.13指针类型指针类型n4.13.1指针概念、指针空挂与垃圾回收n4.13.2C语言的指针类型n4.13.3Ada的accesstypen4.13.4C#语言的内存管理机制5
22、34.13.1指针概念、指针空挂与指针概念、指针空挂与垃圾回收垃圾回收n指针也是一种变量,其值是另一个变量的地址。n空挂当某个对象已经不存在,而到达它的路径依然存在时,该路径即被挂空。(本质上是一个生命期的问题)544.13.1指针概念、指针空挂与垃指针概念、指针空挂与垃圾回收圾回收(2)垃圾回收当到达某个对象的所有路径均已消失,该对象即无法使用,该对象所占有的空间应该作为垃圾被回收55n指针空挂和垃圾回收是两个相对的概念。n指针空挂和垃圾回收的后果是不同的。垃圾不及时回收仅仅是消耗系统资源而已,在资源耗尽之前不会造成软件运行的错误,而指针空挂会很快导致软件运行错误。n一般来说垃圾回收是操作系
23、统的任务,解决指针空挂是语言的任务。564.13.2C语言的指针类型语言的指针类型C语言本身没有提供避免指针空挂的措施,没有考虑垃圾回收问题。指针在C语言中使用非常广泛,部分原因是指针有时是表达计算的最佳方法,部分原因是指针通常比其它方法可以生成更加高效、紧凑的代码。57C语言中和指针使用有关的编码规范形式:形式:1.条目条目2.告告警警级级别别(error/warning/informational)3.理由理由4.实例实例581不要修改指向未释放内存的指针不要修改指向未释放内存的指针告警级别:告警级别:Warning。理理由由:可能会引起内存泄漏。对于堆变量的使用,我们采用以下约定:用于申
24、请内存的那些指针代表该内存块,这些指针不可以被修改,最后这一块内存必须且只能通过这个指针释放;那些由其它指针赋值或取对象地址得到的指针被认为是中间变量式的指针,他们不代表相应的地址,我们也不用他们释放内存。592禁止使用不代表内存块的指针释放内存禁止使用不代表内存块的指针释放内存告警级别:告警级别:Error。理理由由:如果使用不代表内存块的指针释放内存可能引起内存的不完全释放、越界释放、指针空挂、重复释放等问题。3从堆中申请的内存应该保存起始地址从堆中申请的内存应该保存起始地址告警级别:告警级别:Error。理理由由:如果不保存会引起内存丢失,因为我们无法释放该内存。例如:p=new Xn+
25、2;一种改进方法是:q=new Xn;p=q+2;604尽尽量量不不要要重重复复使使用用一一个个指指针针申申请请内内存存(虽虽然然每每次次重复申请前都进行了释放。)重复申请前都进行了释放。)告警级别:告警级别:Informational。理理由由:为了使每块堆空间有明确的代表指针(custodialpointer)我们建议一般不要使用一个指针重复申请内存(建立链表过程除外)。5堆变量作用域结束时要释放相应的内存堆变量作用域结束时要释放相应的内存告警级别:告警级别:Warning。理理由由:如果堆变量作用域结束时没有释放相应的内存,可能引起内存泄漏。616禁止将在内层申请的堆变量地址传给外层禁止
26、将在内层申请的堆变量地址传给外层告警级别:告警级别:Error。理理由由:将在内层申请的堆变量地址传给外层可能引起指针空挂。7memcopy和和memmove中中,源源指指针针和和目目标标指指针针的有效类型(的有效类型(effective type)要兼容。)要兼容。告警级别:告警级别:Warning。8memcopy和和memmove中中最最好好整整体体操操作作(第三个参数的值等于源指针指向的对象的大小)告警级别:告警级别:Informational。理理由由:向目的地址拷贝(移动)时,一般为整体操作,如果只有拷贝(移动)一部分,需要在文档中注明。629禁止内存越界使用禁止内存越界使用告警级
27、别:告警级别:Error。理理由由:内存越界使用会引起非法操作异常,目前只能检测静态可识别的内存越界。10禁禁止止向向指指针针对对象象传传送送大大小小超超过过其其申申请请范范围的对象(一般来说是过大的数组)围的对象(一般来说是过大的数组)告警级别:告警级别:Error。6311禁禁止止将将内内层层自自动动变变量量的的地地址址传传给给外外层层指指针针(包包括括两两种种情情况况,一一种种是是以以参参数数形形式式传传回回,另一种是通过另一种是通过return语句传出去)。语句传出去)。告警级别:告警级别:Error。理理由由:会引起指针空挂,因为内层声明的自动变量在返回外层时自动释放,这样当外层再使
28、用那个地址时就引起指针空挂。6412禁止将一自动变量的地址赋给一静态变量禁止将一自动变量的地址赋给一静态变量告警级别:告警级别:Error。理理由由:将一个自动变量的地址赋值给一个静态变量容易引起地址空挂。因为当函数返回时,静态变量还会存在,而自动变量将消逝,这样静态变量所指的变量已经释放,从而引起指针空挂。13禁止向指针或数组名赋负整数禁止向指针或数组名赋负整数告警级别:告警级别:Error。理由:理由:内存不可能为负地址。14禁止取数组的地址禁止取数组的地址告警级别:告警级别:Error。理由:理由:这种操作一般来说没有意义。6515远、近指针相互转换远、近指针相互转换告警级别:告警级别:
29、Warning。理由:理由:可能会丢失或得到错误的地址信息。16取寄存器变量的地址取寄存器变量的地址告警级别:告警级别:Error。理由:理由:寄存器不在内存寻址范围内。17禁止没有左值的取地址操作禁止没有左值的取地址操作告警级别:告警级别:Error。理理由由:一元操作&必须有一个左值放在赋值号的左边用来存放地址。661不不要要修修改改指指向向未未释释放放内内存存的的指指针针2禁禁止止使使用用不不代代表表内内存存块块的的指指针针释放内存释放内存3从从堆堆中中申申请请的的内内存存应应该该保保存存起起始地址始地址4尽尽量量不不要要重重复复使使用用一一个个指指针针申申请请内内存存(虽虽然然每每次次
30、重重复复申申请请前前都进行了释放。)都进行了释放。)5堆堆变变量量作作用用域域结结束束时时要要释释放放相相应的内存应的内存6禁禁止止将将在在内内层层申申请请的的堆堆变变量量地地址传给外层址传给外层7 memcopy和和memmove中中,源源指指针针和和目目标标指指针针的的有有效效类类型型(effective type)要兼容。)要兼容。8 memcopy和和memmove中中最最好好整整体体操操作作(第第三三个个参参数数的的值值等等于于源源指指针针指指向向的的对对象象的的大大小小)9禁止内存越界使用禁止内存越界使用10禁止向指针对象传送大小超禁止向指针对象传送大小超过其申请范围的对象(一般来
31、过其申请范围的对象(一般来说是过大的数组)说是过大的数组)11禁止将内层自动变量的地址禁止将内层自动变量的地址传给外层指针传给外层指针12禁止将一自动变量的地址赋禁止将一自动变量的地址赋给一静态变量给一静态变量13禁止向指针或数组名赋负整禁止向指针或数组名赋负整数数14禁止取数组的地址禁止取数组的地址15远、近指针相互转换远、近指针相互转换16取寄存器变量的地址取寄存器变量的地址17禁止没有左值的取地址操作禁止没有左值的取地址操作674.13.3 Ada的access type684.13.3.1设计目标设计目标n灵活性n一致性694.13.3.2Categoriesofaccesstypes
32、1access type access to subprogram general pool specific access to object access to variable access to variable access to constant 704.13.3.3pool-specificaccesstypespool-specificaccesstypesandstoragepool例:typeRef_Int_AisaccessInteger;typeRef_Int_BisaccessInteger;RA:Ref_Int_A:=newInteger(10);RB:Ref_In
33、t_B:=newInteger(20);RA.all:=RB.all;RA:=RB;-illegal71指向指向Poolspecificobjects的指针的的指针的释放释放n每一个poolspecificaccesstype对应一个pool,该类型的accessvariable都在且仅在该pool中申请空间。n当程序运行超过了该类型的作用域时,将该pool中的所有object同时释放。72理论依据理论依据nPoolspecificaccesstype也实行按名等价,所以,要真正使用poolspecificaccesstype必须首先声明有名的类型说明。nAccessvariable的声明必须
34、在相应的poolspecificaccesstype的声明之后,也就是说,这些accessvariable的作用域不可能超出相应的poolspecificaccesstype的作用域。73n当程序运行超出某poolspecificaccesstype的作用域时,也必然超出了该类型的accessvariable的作用域,这时,该pool中的所有objects都不可用,也没有用了,当然可以释放。n当程序运行没有超出该作用域时,不释放pool中的动态对象,当然也就不会出现对象释放了但是引用路径(指针)没有释放的情况,即不会出现指针空挂现象。74n该方式没有对每个动态object进行及时释放,会造成少
35、量的垃圾没有及时回收的情况。但是由于一般一个模块中申请的动态对象不会太多,所以此法不会造成严重问题。事实上,在军方的嵌入式系统中(一般硬件资源都比较紧张),该方法没有遇到明显的资源浪费问题。754.13.3.4generalaccesstypegeneral access types,whose values candesignatetheelementsofanystoragepool,as well as aliased objects created bydeclarations rather than allocators,andaliasedsubcomponentsofothero
36、bjects(前提 是 必 须 在 该 component的 说 明 前 加aliased)764.13.3.5accessibilitynThe basic rule is that the lifetime of anaccessedobjectmustbeatleastaslongasthatoftheaccessobject.n各模块之间的调用关系形成了一个动态的层次嵌套关系,同一层的变量具有相同的生命期。77n这样,我们对变量生命期的比较就转换为对变量所在的模块的当次执行所在的层次的比较。n于是,我们要求被引用对象所在的层次应该处于引用对象(指针)的外层或者同层。基于这种意义,我们把
37、模块执行中的动态层次关系叫做引用层次(accesslevel).78nAda语言要求在引用类型变量(指针)赋值和引用类型转换的过程中检查源操作数和目标操作数的accesslevel。n当accesstype作为形参时必须是匿名类型。nAccesslevel信息在引用类型变量赋值时的传递。n为了实现静态检查,将规则改为:Thebasicruleisthatthelifetimeofanaccessedobjectmustbeatleastaslongasthatoftheaccesstype.79例例11.procedureMainis2.TypeAIisaccessallInteger;3.R
38、ef1:AI;4.begin5.declare6.Ref2:AI;7.I:aliasedInteger;8.begin9.Ref2:=IAccess;10.Ref1:=Ref2;11.end;12.13.declare14.-someothervariables15.begin16.Ref1.all:=0;17.end;18.endmain;80例例21.declare2.typeAIisaccessallInteger;3.I:aliasedInteger;4.RefI:AI:=IAccess;5.begin6.7.declare8.typeAJisaccessallInteger;9.J:
39、aliasedInteger;10.RefJ:AJ:=JAccess;11.begin12.13.RefI:=AI(RefJ);-illegal14.15.end;16.17.end;814.13.3.6间接引用的对象的消亡间接引用的对象的消亡从以上分析可以看出,间接引用对象的消亡(其所占用空间的释放)由系统实现,这样大大减轻了程序员的负担,而且可以有效避免诸如指针空挂及反复释放同一存储空间等问题。824.13.3.7自由指针自由指针nunckecked_deallocation834.13.3.8类型转换的基本原则类型转换的基本原则n不同的Poolspecifictype之间不允许,gene
40、ralaccesstype之间:他们所指对象之间静态match;目标类型的life_time必须nogreaterthan源类型。Poolspecifictogeneralaccesstype:yes,vice,no.844.13.4C#语言的内存管理机制语言的内存管理机制nC#语言的值类型和引用类型C#supportstwokindsoftypes:value typesandreference types.Valuetypesincludesimpletypes(e.g.,char,int,andfloat),enumtypes,andstructtypes.Referencetypesi
41、ncludeclasstypes,interfacetypes,delegatetypes,andarraytypes.85n值类型的变量中直接存放该变量的数据,引用类型的变量中存放对其它对象的引用。两个引用类型的变量可能指向相同的对象,这样对一个引用变量的操作也就影响了另一个引用变量。对于值类型的变量来讲,每一个变量仅仅代表它自己,对一个值变量的操作不会影响到其它的变量。86n通俗地讲,多个引用变量可能代表的是同一份拷贝,而每个值变量仅仅代表它自己的拷贝。n或者说,对于引用变量才存在别名问题,而值变量并不存在别名问题。87using System;class Class1public int
42、 Value=0;class Teststatic void Main()int val1=0;int val2=val1;val2=123;Class1 ref1=new Class1();Class1 ref2=ref1;ref2.Value=123;88Console.WriteLine(Values:0,1,val1,val2);Console.WriteLine(Refs:0,1,ref1.Value,ref2.Value);TheoutputoftheprogramisValues:0,123Refs:123,12389n对于引用类型的对象,在安全模式下不需要程序员自己去释放,而是
43、由系统采用引用计数机制去释放。904.14recordtypen4.14.1Examplesn4.14.2legalityrulesn4.14.3RecordRepresentationClauses91n1数据类型的概念是如何随着程序设计语言的发展而发展的?n2强类型系统中数据类型设计的理想目标是什么?你所了解的各个程序设计语言离这个目标有多远?n3理解强类型概念的相对性,你所了解的各个程序设计语言达到了哪个强类型层次?复习题92n4介绍你所熟悉的一种程序设计语言的数据类型体系,将其与Ada语言的数据类型体系进行比较。n5介绍你所熟悉的一种程序设计语言的用户定义数据类型设施和数据类型兼容规则
44、,将其与Ada语言进行比较。n6名词解释:type,subtype复习题93n7Ada语言的枚举数据类型是怎样实现抽象语义与具体实现的分离的?它的类型转换规则如何?你认为定义这种转换规则的依据何在?Ada语言的枚举数据类型与C语言的枚举数据类型相比在概念性和灵活性方面如何?复习题94n8Ada语言的各类数值类型的表示能力、操作、兼容及转换规则?n9简要介绍Ada语言的数组类型(下标、数组元素、分类、类型兼容性)。n10.某些语言中无标志的变体记录类型有何缺陷?复习题95n11(1)介绍由于存在指针类型而引发的引用挂空和垃圾问题,这两个问题又何本质区别?你所熟悉的语言中,哪些情况会引发这两个问题
45、,怎样解决?(2)C语言的引用类型和指针类型有何区别?引用类型会引发引用空挂和垃圾问题吗?(3)Ada语言是怎样解决这两个问题的?(两种access type,generalaccesstype与accessibility,generalaccesstype之间的类型兼容及转换规则,generalaccesstype的数据对象指向pool中的对象)复习题96图1返回97附 录 A:4.2 图2返回98附 录 A:4.2 图3返回99Thanksforyourtimeandattention!100谢谢观看/欢迎下载BY FAITH I MEAN A VISION OF GOOD ONE CHERISHES AND THE ENTHUSIASM THAT PUSHES ONE TO SEEK ITS FULFILLMENT REGARDLESS OF OBSTACLES.BY FAITH I BY FAITH