编辑: 黑豆奇酷 2019-07-08

或编译时检查,即静态类型检查. 高级语言的主要优点之一:可提供对所有(或几乎所有)操作的类型检查. 动态类型检查 需类型标志,不需对变量声明(即变量是无类型的).优点:编程的灵活性.程序员不需考虑类型问题,具有较高灵活性.缺点:程序难于调试,不能完全消去所有参数类型错误.程序测试不可能检测所有的路径.需要在执行过程中保持类型信息,需存储空间.动态检查需以软件实现,有时间花销. 静态类型检查 需要的信息通常由程序员在声明中及在其他语言结构中提供.需要:

1、对每个操作,其参数的数量、顺序、类型及结果类型.

2、对每个变量,被关联的命名数据对象的类型.

3、每个常量数据对象的类型.编译器在翻译的早期阶段收集声明中的类型信息,以后将用于类型检查.静态检查涉及语言的多个方面:声明、数据控制结构、分开编译等. 静态与动态类型检查 静态检查将针对程序中的所有操作进行,所有可能的执行路径均被检查.因此,关于类型错误的进一步测试是不需要的,因而不需类型标记和运行时类型检查.在多数语言中,对某些语言结构的静态检查在某种情况下是不可能的.解决方案:采用动态类型检查或不检查. 类型检查 强类型如果我们可以静态地检测程序中的所有类型错误,则称语言是强赋类型的.通常类型为程序提供了一个安全层次.一个函数f: S→R称为类型安全的,如果f的执行不会产生R以外的值.类型安全的操作均不需动态检查.很少有语言是真正强类型的.类型推导如果解释不会出现二义性,则类型声明可以省去.可由语言实现推导出失去的类型信息. 类型转换和类型的强制转换 如果在类型检查中,参数的实际类型和操作期望的类型间出现不匹配,则有两种处理方案:

1、指出出错

2、通过强制(隐式的类型转换)来改变实际参数的类型为正确类型.类型转换的基调为:conversion-op : type1→type2将一个对象变为另一类型的对象.大多数语言以两种方式提供类型转换:

1、作为固有函数,程序员可显式地调用.如:将实数变成整数,Pascal中的round,C中的(int) x

2、作为强制,自动在类型失配时调用.如:整数和实数间相加,总是先将整数转变为实数. 类型转换和类型的强制转换 强制的基本原则是不失信息.这类强制称为widening或promotion.如强制会丢失信息,则称为变窄(narrowing)类型转换可能需要数据对象在运行时存储表示的改变,如:COBOL和PL/1中,数值以字符串方式存放,要相加需先转换,结果又要转换为字符串.有的语言中不提供类型强制,类型不匹配即被视为出错.而有的语言则尽可能在不匹配时采用强制(如C). 返回 赋值和初始化 赋值是一基本操作,改变值到数据对象的绑定,这个改变是操作的副作用.有的语言中,赋值语句也返回值(作为表达式处理),该返回值包含被赋值拷贝的数据对象.Pascal中,赋值的规约为:Assignment (:=) : integer1*integer2→void.integer2值赋给integer1无显式返回.C中,规约为:Assignment (=) : integer1*integer2→integer3integer2值的拷贝赋给integer1,同时创建并返回包含integer2值的新数据对象integer3. 赋值 考虑赋值 X := X右边的X称右端值,用于引用包含在命名数据对象中的值,r-值.左边的X用于引用将包含新值的数据对象的位置,称为左值,l-值.赋值操作定义为:

下载(注:源文件不在本站服务器,都将跳转到源网站下载)
备用下载
发帖评论
相关话题
发布一个新话题