类型转换和强制 如果在类型检查中,参数的实际类型和操作期望的类型 间出现不匹配,则有两种处理方案: 1、指出出错 2、通过强制(隐式的类型转换)来改变实际参数的 类型为正确类型。 类型转换的基调为 conversion-op: type l-type2 将一个对象变为另一类型的对象 大多数语言以两种方式提供类型转换: 、作为固有函数,程序员可显式地调用。 如:将实数变成整数, Pascal中的 round,C中的 It)x 2、作为强制,自动在类型失配时调用。 如:整数和实数间相加,总是先将整数转变为实数
•类型转换和强制 如果在类型检查中,参数的实际类型和操作期望的类型 间出现不匹配,则有两种处理方案: 1、指出出错 2、通过强制(隐式的类型转换)来改变实际参数的 类型为正确类型。 类型转换的基调为: conversion-op : type1→type2 将一个对象变为另一类型的对象。 大多数语言以两种方式提供类型转换: 1、作为固有函数,程序员可显式地调用。 如:将实数变成整数,Pascal中的round,C中的 (int) x 2、作为强制,自动在类型失配时调用。 如:整数和实数间相加,总是先将整数转变为实数
强制的基本原则是不失信息。 这类强制称为 widenings或 promotion 如强制会丢失信息,则称为变窄( narrowing) 类型转换可能需要数据对象在运行时存储表示的改变, 如: COBOL和PL/1中,数值以字符串方式存放,要相加 需先转换,结果又要转换为字符串 有的语言中不提供类型强制,类型不匹配即被视为出错 而有的语言则尽可能在不匹配时采用强制(如C)
强制的基本原则是不失信息。 这类强制称为widenings或promotion。 如强制会丢失信息,则称为变窄(narrowing) 类型转换可能需要数据对象在运行时存储表示的改变, 如:COBOL和PL/1中,数值以字符串方式存放,要相加 需先转换,结果又要转换为字符串。 有的语言中不提供类型强制,类型不匹配即被视为出错。 而有的语言则尽可能在不匹配时采用强制(如C)
赋值和初始化 赋值是一基本操作,改变值到数据对象的绑定,这个改变 是操作的副作用 有的语言中,赋值语句也返回值(作为表达式处理),该 返回值包含被赋值拷贝的数据对象。 Pascal中,赋值的规约为: Assignment(:=): integer× Integer2→void Integer2值赋给 Integer I无显式返回。 C中,规约为: Assignment(): integer X integer 3 Integer2值的拷贝赋给 integer, 同时创建并返回包含 Integer2值的新数据对象 integer?3
赋值和初始化 •赋值是一基本操作,改变值到数据对象的绑定,这个改变 是操作的副作用。 •有的语言中,赋值语句也返回值(作为表达式处理),该 返回值包含被赋值拷贝的数据对象。 •Pascal中,赋值的规约为: Assignment (:=) : integer1×integer2→void. integer2值赋给integer1无显式返回。 •C中,规约为: Assignment (=) : integer1×integer2→integer3 integer2值的拷贝赋给integer1, 同时创建并返回包含integer2值的新数据对象integer3
·考虑赋值X:=X 右边的ⅹ称右端值,用于引用包含在命名数据对象中的 值,r值 左边的X用于引用将包含新值的数据对象的位置,称为 左值,1-值 赋值操作定义为: 1、计算第一个操作数表达式的左值 2、计算第二个操作数表达式的右值 3、将右值赋给左值对象 4、返回右值作为操作的结果
•考虑赋值X:=X 右边的X称右端值,用于引用包含在命名数据对象中的 值,r-值。 左边的X用于引用将包含新值的数据对象的位置,称为 左值,l-值。 •赋值操作定义为: 1、计算第一个操作数表达式的左值。 2、计算第二个操作数表达式的右值。 3、将右值赋给左值对象。 4、返回右值作为操作的结果
°赋值的两个不同视角: Numeric assignment in Pascal A: 7.2 0.4 0.4 B 0.4 Before After Pointer assignment in C 7.2 A: B 0.4 B 0.4 Before After
•赋值的两个不同视角: