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

类型等价

image_up_16407948772cc33cbc.jpg 上图,AB 等价,BC 不等价。

image_up_16407948954352e843.jpg 上图,abc 等价。

总结: 忽略名称,如果类型表达式(类型变量统统展开)完全相同(包括顺序),则结构等价

注意:实际应用中,int a [10];int b [20];,ab 不等价。

实际应用中,可以通过二进制表示类型,通过二进制比较等价:

image_up_16407950725e236e2d.jpg

名字等价

  • 名字等价把每个类型名看成是一个可区别的类型
  • 两个类型表达式名字等价,当且仅当它们完全相同。

通俗地说,就是增加一层类型抽象。将用户的类型看得同样重要。那么你可以用 Circle (x,y) 表示圆,Vec2d (x,y) 表示二维向量,二者结构等价,但类型不等价。

注意:C 语言对于类型结构体特殊处理,遵循名字等价。例如:

struct {
    int i;
    double j;
} x,y;

struct {
    int i;
    double j;
} z;

x = z 会出现类型错误。x = y 不会。

类型图

image_up_164079523126ceafbe.jpg

image_up_1640795248fcbb55c3.jpg