eg
B:record
i: integer;
c: char;
r: real
end;
则 B 的类型表达式为
record(
(i × integer) ×
(c × char) ×
(r × real)
)
eg
table: array[1..10] of row;
table 的类型表达式为:
array(1..10,row)
eg
struct stype
{
char[8] name;
int score;
};
stype[50] table;
stype* p;
给出 stype
table
p
的类型表达式。
答:
record (
(
name × array(8,char)
) × (score × integer)
)
array(50,stype)
pointer(stype)
eg
function fun(a: char, b: integer): ↑integer;
答:
(char × integer) -> pointer(integer)
eg
typedef struct {
char id_no[10];
int score;
} student;
student class1[30], * class2[30];
FILE *fp;
int putw(int w, FILE *fp);
给出 student
, class1
, class2
, fp
, putw
的类型表达式。
// TODOWORK
类型等价
上图,AB 等价,BC 不等价。
上图,abc 等价。
总结: 忽略名称,如果类型表达式(类型变量统统展开)完全相同(包括顺序),则结构等价。
注意:实际应用中,int a [10];int b [20];
,ab 不等价。
实际应用中,可以通过二进制表示类型,通过二进制比较等价:
名字等价
- 名字等价把每个类型名看成是一个可区别的类型。
- 两个类型表达式名字等价,当且仅当它们完全相同。
通俗地说,就是增加一层类型抽象。将用户的类型看得同样重要。那么你可以用 Circle (x,y) 表示圆,Vec2d (x,y) 表示二维向量,二者结构等价,但类型不等价。
注意:C 语言对于类型结构体特殊处理,遵循名字等价。例如:
struct {
int i;
double j;
} x,y;
struct {
int i;
double j;
} z;
则 x = z
会出现类型错误。x = y
不会。