Javascript must be enabled in your browser to use this page.
Please enable Javascript under your Tools menu in your browser.
Once javascript is enabled Click here to go back to �нтеллектуальная Кобринщина

Эквивалентность и совместимость типов

Эквивалентность типов

В языке программирования Паскаль строго определено, какие типы описывают идентичные множества значений (т.е эквивалентны). В языке принят принцип именной эквивалентности типов, устанавливающий, что два типа T1 и T2 эквивалентны, если выполняется одно из следующих условий.

T1 и T2 — одно и то же имя типа.

Тип T2 описан с использованием типа T1 равенством вида type T2=T1; или последовательностью подобного вида равенств. Например:

type

            T1=integer;

            T3=T1;

            T2=T3;

Так, несмотря на абсолютную идентичность, приведенные ниже типы не являются эквивалентными.

type

            tp1 = array[1..10] of real;

            tp2 = array[1..10] of real;

Если переменные описаны совместно, то они обладают эквивалентными типами. Например:

var

            v1, v2: tp1;

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

Одним из требований в языке программирования Pascal является следующее: в выражениях (в том числе при сравнении) должны использоваться операнды с совместимыми типами. Типы совместимы, если выполняется хотя бы одно из условий.

Оба типа эквивалентны.

Оба типа целые.

Оба типа вещественные.

Один из типов имеет интервальный тип, а другой тип является для него базовым:

type

            tp1 = integer;

            tp2 = -1..1000;

Оба типа являются диапазонами одного и того же базового типа

type

            tp1 ='a'..'z';

            tp2 = 'a'..'f';

Один тип строковый, а второй — либо строковый, либо символьный, либо упакованный символьный массив.

Оба типа — упакованные символьные массивы с одинаковым числом элементов.

Оба типа множественные с совместимыми базовыми типами:

type

            tp1 = set of byte;

            tp2 = set of 1..100;

Один тип является ссылочным, а второй — либо ссылочный, либо бестиповый указатель.

Оба типа — это процедурные типы с одним и тем же числом параметров, причем типы параметров должны быть эквивалентными (в соответствии с их порядком следования), а для функциональных типов также должны быть эквивалентными типы результатов.

Если в выражении типы совместимы, но различны, то тип результата определяется более общим (т.е. тем, который включает в себя все возможные значения другого типа) из типов операндов.

Кроме понятий эквивалентности и совместимости типов в Pascal введено понятие совместимости по присваиванию.

Оператор присваивания корректен, если тип переменной в его левой части совместим по присваиванию с типом выражения в правой части. Для этого должно выполняться хотя бы одно из условий.

Оба типа эквивалентны, но ни один из них не является файловым типом или сложным типом, использующим файловый тип.

Оба типа — совместимые дискретные типы, и текущее значение типа t2 попадает в диапазон возможных значений типа t1.

Оба типа вещественные, и текущее значение типа t2 попадает в диапазон возможных значений типа t1.

Тип левой части вещественный, а тип правой части — целый.

Тип t1 является строковым, а t2 — либо строковый, либо символьный, либо упакованный символьный массив.

Оба типа представляют собой упакованные символьные массивы.

Оба типа — совместимые множественные типы, причем множество из правой части целиком входит во множество, указанное в левой части.

Оба множества — совместимые ссылочные типы.

Тип левой части процедурный, а правая часть представляет собой имя процедуры или функции с тем же числом параметров, что и у типа в левой части; типы соответствующих параметров (а также типы результата для функции) должны быть эквивалентными.

Оба типа являются объектными, причем тип t2 является потомком типа t1.

Оба типа - ссылочные типы на совместимые объектные типы.