Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Справочник Pascal ABC.doc
Скачиваний:
67
Добавлен:
07.11.2018
Размер:
985.6 Кб
Скачать

Неявное приведение типов

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

Типы byte, word и integer неявно преобразуются друг к другу, а также к типам real и complex.

Тип real неявно преобразуется к типу complex.

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

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

Указатель на любой тип неявно преобразуется к указателю pointer.

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

Множество неявно преобразуется к другому множеству, если его базовый тип неявно преобразуется к базовому типу этого другого множества.

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

Все возможные неявные преобразования типов проиллюстрированы в программе ImplicitCast.pas.

В процессе выполнения программы после неявного преобразования числовых типов может произойти переполнение. Например, это возможно при преобразовании типа integer в тип byte. Однако, если s1 и s2 - строки и при присваивании s1:=s2 данные строки s2 не умещаются в строку s1, то остаток строки усекается без возникновения ошибки.

Операнды в выражениях также могут иметь разные типы. В этом случае обычно меньший тип неявно приводится к большему или оба типа приводятся к большему. Например, если r имеет тип real, а i - тип integer, то в выражении r+i значение i вначале приводится к типу real, после чего выполняется операция сложения над двумя вещественными значениями. Если строка s1 имеет тип string[30], а s2 - тип string[40], то в выражении s1+s2 обе строки приводятся к типу string и только потом выполняется операция сложения.

Выражения "меньший тип" и "больший тип" в предыдущем абзаце используются в смысле диапазона значений. Например, тип set of 1..9 меньше типа set of byte, но ни один из типов set of 1..9 и set of 5..15 не меньше другого.

Явное приведение типов

Некоторые типы не приводятся к другим неявно, однако такое преобразование имеет смысл. Например, переменную типа char можно преобразовать к значению типа byte, являющемуся кодом символа. Переменную типа integer, содержащую неотрицательное значение, можно преобразовать к интервальному типу, причем, это значение будет выступать номером элемента в порядковом типе.

Для преобразования выражения к новому типу используется конструкция

имя нового типа(выражение)

Например:

type   pinteger=^integer;   days=(mon,tue,wed,thi,fri,sat,sun); var   p: pointer;   i: integer;   en: days; ... p:=pinteger(@i); i:=integer(en): en:=days(3);

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

p:=^integer(@i);

Явные преобразования типов содержат все неявные. Кроме того, все порядковые типы можно явно преобразовывать друг к другу, все порядковые типы можно явно преобразовывать к типам real и complex, базовый класс можно явно преобразовать к производному и указатель pointer можно явно преобразовать к указателю на любой тип.