Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Программирование / WORD / Лекции по ЯП (часть 1).doc
Скачиваний:
104
Добавлен:
15.04.2015
Размер:
1.69 Mб
Скачать

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

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

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

Определение совместимости типов.

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

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

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

  • оба целые;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

  • Т1 и Т2 - совместимые процедурные типы;

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

Строгая дисциплина типов — это несомненное преимущество языка Паскаль, поскольку несоответствие типов в определенных ситуациях может приводить к не­верной работе программы, а обнаружить в программе ошибки такого рода часто очень и очень сложно. Нарушение правил совместимости типов обнаруживается обычно на стадии компиляции и сопровождается выдачей сообщения Type mismatch.

8.2. Преобразование (приведение) типов и значений

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

8.2.1. Явное преобразование типов и значений

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

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

Пусть, например, типы typel и type2 имеют одинаковый размер (занимают в памяти одинаковое число байтов). Допустим, что х является пере­менной типа typel, а у — переменной типа type2. Предположим, наконец, что х при­своено какое-то значение. Тогда приведение типа

y := type2(x)

просто интерпретирует данные, хранящиеся в х, как значение типа type2, на которое ссылаются по имени у. В частности, если N имеет тип Byte, a ch — тип Char, то допустимы следующие операторы присваивания:

Ch := Char(N);

N := Byte(Ch);

В Паскале допускается и приведение типа значений. Приведение типа значений выглядит следующим образом:

TypeID(expression),

где TypeID — идентификатор типа, а в круглых скобках стоит выражение expressi on, которое может представлять собой просто константу. Следует иметь в виду, что тип выражения и задаваемый тип должны быть перечисляемыми типами или указателями. Для перечисляемых типов результирующее значение получается путем преобразования выражения и его проверки на нахождение в допустимых границах. Преобразование может привести к усечению или увеличению размера исходного значения в том случае, если результирующий тип отличается от типа выражения. В том случае, когда значение расширяется, его знак всегда сохраняется. Приведение типа значений не должно встречаться в левой части оператора присваивания.