Тип Равенство
Значение основных операций, таких как присваивание (обозначается = в 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;
если эквивалентность имени используется в языке, то x
и y
будут одного типа, а r
и s
будут того же типа, но тип x
или y
не будут эквивалентны типу r
или s
. Это означает, что такие заявления, как
x = y;
r = s;
будет допустимым, но такие утверждения, как
x = r;
не будет действительным (т.е. не будет принято переводчиком).
Использование структурной эквивалентности: , два типа равны тогда и только тогда, когда они имеют одинаковую "структуру" , что можно интерпретировать по-разному.
Строгое толкование состоит в том, что имена и типы каждого компонента двух типов должны быть одинаковыми и должны быть перечислены в том же порядке в определении типа.
Менее строгим требованием будет то, что типы компонентов должны быть одинаковыми и в одинаковом порядке в обоих типах, но имена компонентов могут отличаться.
Снова рассмотрев приведенный выше пример, используя структурную эквивалентность , два типа Stack
и Set
будут считаться эквивалентными, что означает, что переводчик будет принимать такие выражения, как
x = r;
(Обратите внимание, что C
не поддерживает структурную эквивалентность и выдаст ошибку для указанного выше назначения.)