类型相等
诸如赋值之类的基本操作的含义(在 C 中用 = 表示)在语言定义中指定。因此,例如,诸如
之类的语句的含义
x = y;
这里对象y的值被复制到变量x的内存位置。
但是,在翻译器可以接受诸如赋值之类的操作之前,通常两个操作数的类型必须相同(或者可能以某种其他指定的方式兼容)。
因此,语言翻译者必须决定在某些情况下两种类型是否相等。我们现在考虑说两种类型“相等”(或等价)是什么意思。
有两种标准方法可以确定两种类型是否相同:名称等价和结构等价。
名称等价是最直接的:当且仅当它们具有相同的名称时,两个类型才相等。因此,例如,在代码中(使用C 语法)
typedef struct {
int data[100];
int count;
} Stack;
typedef struct {
int data[100];
int count;
} Set;
Stack x, y;
Set r, s;
如果 name equivalence 在语言中使用,那么 x 和 y 将属于同一类型,r 和 s 将属于同一类型,但类型x 或 y 的类型不等同于 r 或 s 的类型。这意味着诸如
之类的语句
x = y;
r = s;
会是有效的,但是诸如
之类的陈述
x = r;
无效(即不会被翻译人员接受)。
使用结构等价:两个类型相等当且仅当它们具有相同的“结构”,可以用不同的方式解释。
严格的解释是这两种类型的每个组件的名称和类型必须相同,并且必须在类型定义中以相同的顺序列出。
一个不太严格的要求是组件类型必须相同并且在两种类型中的顺序相同,但是组件的名称可以不同。
再看上面的例子,使用 structural equivalence,Stack 和 Set 这两种类型会被认为是等价的,这意味着翻译者会接受诸如
之类的语句
x = r;
(注意C 不支持结构等价,上面的赋值会报错。)