Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Информатика - лекции.doc
Скачиваний:
18
Добавлен:
07.11.2018
Размер:
512.51 Кб
Скачать

Совместимость и преобразование типов.

Как уже неоднократно отмечалось, Турбо Паскаль - это типизированный язык. Он построен на основе строгого соблюдения концепции типов, в соответствии с которой все применяемые в языке операции определены только над операндами совместимых типов. При обсуждении операций над вещественными данными мы уже затрагивали проблему совместимости вещественных и целых типов. Аналогичные проблемы возникают при операциях над строками разной длины, строками и символами и т.д. Ниже приводится более полное определение совместимости типов.

Два типа считаются совместимыми, если:

  • оба они есть один и тот же тип;

  • оба вещественные;

  • оба целые;

  • один тип есть тип-диапазон второго типа;

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

  • оба являются множествами, составленными из элементов одного и того же базового типа;

  • оба являются упакованными строками (определены с предшествующим словом PACKED) одинаковой максимальной длины;

  • один тип есть тип-строка, а другой - тип-строка, упакованная строка или сим­вол;

  • один тип есть любой указатель, а другой - нетипизированный указатель;

  • один тип есть указатель на объект, а другой - указатель на родственный ему объект;

  • оба есть процедурные типы с одинаковыми типом результата (для типа-функции), количеством параметров и типом взаимно соответствующих пара­метров.

Совместимость типов приобретает особое значение в операторах присваивания. Пусть Т1 - тип переменной, а Т2 - тип выражения, т.е. выполняется присваивание T1 := Т2. Это присваивание возможно в следующих случаях:

• T1 и Т2 есть один и тот же тип и этот тип не относится к файлам или массивам файлов, или записям, содержащим поля-файлы, или массивам таких записей;

• Т1 и Т2 являются совместимыми порядковыми типами и значение Т2 лежит в диапазоне возможных значений T1

• T1 и Т2 являются вещественными типами и значение Т2 лежит в диапазоне возможных значений T1;

• T1 - вещественный тип и Т2 - целый тип;

• T1 - строка и T2 - символ;

• T1 - строка и Т2 - упакованная строка;

• T1 и Т2 - совместимые упакованные строки;

• T1 и T2 - совместимые множества и все члены T2 принадлежат множеству возможных значений T1;

• T1 и Т2 - совместимые указатели;

• T1 и T2 - совместимые процедурные типы;

• T1 - объект и T2 - его потомок.

В программе данные одного типа могут преобразовываться в данные другого типа. Такое преобразование может быть явным или неявным.

При явном преобразовании типов используются вызовы специальных функций преобразования, аргументы которых принадлежат одному типу, а значение - другому. Таковыми являются уже рассмотренные функции ORD, TRUNC, ROUND, CHR.

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

type

МуТуре = (а, b, с, d) ;

. . . .

... = МуТуре (2)

... = Integer ('D')

... = pointer (longint(a) + $FF)

... = Char (127 mod c)

... = Byte (k)

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

type

byt = array [1..2] of Byte;

int = array [1..2] of Integer;

reс = record

x, у : Integer

end;

var

vbyt : byt;

vint : int;

vrec : rec;

begin

byt(vint[1])[2] := 0;

int(vrec)[1] := 256

end.

Неявное преобразование типов возможно только в двух случаях:

• в выражениях, составленных из вещественных и целочисленных переменных, последние автоматически преобразуются к вещественному типу, и все выражение в целом приобретает вещественный тип;

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