Вопрос об эквивалентности имени - PullRequest
4 голосов
/ 17 марта 2011

Предположим, у меня есть:

int a;
int b;

Являются ли имена переменных a и b эквивалентными (более конкретно, поскольку примитивные типы не имеют имен типов, их можно считать эквивалентными именам)?

Спасибо.

Ответы [ 3 ]

7 голосов
/ 17 марта 2011

Имя (точнее, номинальная) эквивалентность означает, что значения имеют тот же тип, который определен (полностью определенным) именем их типа - например, a и b номинально эквивалентны типу, потому что они обаиметь тип "int".Структурная эквивалентность означает, что считается, что значения имеют один и тот же тип, поскольку их типы являются структурно эквивалентными независимо от имени.Номинальная эквивалентность типа подразумевает эквивалентность структурного типа, поскольку именованный тип структурно эквивалентен самому себе.Ваши a и b номинально эквивалентны типу, потому что имеют одинаковый тип по имени ("int").Утверждение, что «примитивные типы не имеют имен типов», просто ложно - int - это имя типа.И нет никакой разницы между int a; int b; и int a, b; - оба определяют a и b с одним и тем же (структурно и по имени) типом.

Система типов C обычно называется по имени ..Например, int * и short* - это разные типы, даже если int и short имеют одинаковое представление, а struct foo { int x; } и struct bar { int x; } - это разные типы, даже если они всегда имеют одинаковое представление.

0 голосов
/ 17 мая 2017

Я не думаю, что C принимает эквивалентность имени. ИМХО, C принимает структурную эквивалентность с исключениями для структур и союзов; для них используются имена. Это правда, что значения имеют тот же тип, который определяется именем их типа в эквивалентности имен, и что значения считаются такими же, как определено структурно эквивалентным в структурной эквивалентности. Но даже в структурной эквивалентности он не определяется независимо от названия.

По сути, атомарные типы в языке программирования имеют имена, и они используются как в эквивалентности имен, так и в структурной эквивалентности. Разница происходит от производных типов, таких как int * или char[10]. Это правда, что «примитивные типы имеют имена типов». И система типов C сравнивает структуру производных типов вплоть до определенных пользователем имен, исключая синонимы типов, даже если они определены пользователем с использованием typedef.

Система типов

C, как правило, по структуре ... например, int * и short * - это разные типы, но int * и int * - это одни и те же типы. Причина того, что struct foo { int x; } и struct bar { int x; } - это разные типы, заключается в том, что они имеют разную структуру вплоть до определенных пользователем типов имен. Типы struct foo * и struct foo * являются одними и теми же типами, поскольку они находятся в одной структуре. Пожалуйста, не путайте, что struct для структуры типов. Это просто для определения имен типов, точнее, структурных имен тегов в C.

Проще говоря, в структурной эквивалентности типы развертываются до атомарных имен типов и сравниваются. В C типы развертываются до имен, определенных пользователем. (Для развертывания, пожалуйста, обратитесь к http://www.csd.uwo.ca/~moreno//CS447/Lectures/TypeChecking.html/node3.html) В этом разница. Естественно, что имена, эквивалентные типам, структурно эквивалентны, но не наоборот.

Для следующего случая:

int x;
int y;

x и y и оба называют эквивалентными и структурными эквивалентами. Но в следующем случае:

int *x;
int *y;

x и y являются структурными эквивалентами, но не эквивалентны именам. Даже для следующего случая:

int *x, *y;

x и y не считаются эквивалентными в строгой схеме эквивалентности имен, поскольку это объявление рассматривается только как сокращение от предыдущего объявления. Ада - хорошо известный язык, принимающий строгую эквивалентность имен.

0 голосов
/ 17 марта 2011

Некоторые заметки класса, которые я обнаружил, по-видимому, указывают, что с:

int a;
int b;

Переменные a и b не эквивалентны имени.

Однако,с:

int a, b;

Переменные a и b являются именным эквивалентом.

...