Совместимость и преобразование типов.
8.1 Совместимость типов
Паскаль является строго типизированным языком. Это означает:
1. Все данные, используемые в программе должны быть явно объявлены, т.е. указан тип переменных (умолчание не действует).
2. Используемые одной и той же конструкции языка (выражении) данные должны быть согласованы по типу (должны иметь одинаковый или совместимые типы).
Существует несколько уровней совместимости (типов), отличающихся степенью строгости и применяющихся в разных конструкциях языка (и нужно знать, когда какой вид совместимости нужен).
1 уровень: Эквивалентность или тождественность типов.
Существует две стороны (1 и 2) эквивалентности типов:
1) В секции описания типов два типа считаются эквивалентными, если в секции Type тип Т2 явно указан эквивалентным типу Т1 использованием знака “=”.
Type
T2 = T1
2) Две переменные V1 и V2 считаются принадлежащими к одному и тому же типу, если:
- в секции Var справа от двоеточия при объявлении переменных присутствует один и тот же идентификатор (но не описание) типа, например: Var V1 : T1; V2 : T1;
- переменные V1 и V2 объявляются в одной секции Var, причем перечисляются через запятую так, чтобы справа от двоеточия оказался один и тот же тип.
ПРИМЕРЫ тождественности и не тождественности типов:
Пример1:
Type
T1 = array [1..5] of byte;
T2 = array [1..5] of byte;
T3 = T1;
Согласно этому объявлению, типы T1 и T2 не эквивалентны, хотя имеют одно и то же описание типа. Типы Т3 и Т1, согласно последней строке, являются эквивалентными.
Пример2:
Var
они (V1 и V2) эквивалентны только между собой (нельзя обеспечить в программе эквивалентность им по типу никакой другой переменной) |
V3: array [1..5] of byte;
V4: T1;
V5: T1;
V6: T1;
Из этого описания следует:
- переменные V1 и V2 в этом описании имеют эквивалентный тип, потому что они перечисляются слева от одного и того же типа;
- переменная V3 не совместима по типу с переменными V1 и V2;
- переменные V4, V5 и V6 объявляется с типом Т1 и, согласно данному выше определению, имеют тип Т1, эквивалентный Т3.
Правило эквивалентности типов необходимо соблюдать только при вызове процедур и функций. Оно означает, что типы формальных параметров-переменных и соответствующих им фактических параметров должны быть тождественны или эквивалентны.
2 уровень: Совместимость типов.
Типы являются совместимыми, если:
Þ они тождественны;
Þ оба вещественны;
Þ оба целые;
Þ один тип является поддиапазоном другого;
Þ оба типа являются строками с одинаковой объявленной длиной;
Þ оба типа строковые без указания длины;
Þ …………………………………………..
Правила совместимости типов следует соблюдать при записи выражений на Паскале, т.е. нельзя использовать несовместимые типы в одном выражении.
Например, нельзя писать: ‘a’>5 . Однако можно так: byte(‘a’) > 5;
приведение типа значения
3 уровень: Совместимость по присваиванию (менее жесткие, чем в предыдущем случае, требования).
При следующих объявлениях:
Type
T1 = ...
T2 = ...
Var
V1: T1
V2: T2
оператор присваивания вида
V1 := V2;
не вызовет сообщения об ошибке, связанной с несовместимостью типов, если:
- T1 и T2 тождественны или эквивалентны;
- T1 и T2 являются совместимыми порядковыми типами и значение V2 лежит в диапазоне возможных значений V1;
- T1 и T2 - вещественные типы и значение V2 лежит в диапазоне возможных значений переменной V1;
- если T1 - вещественный, а T2 - целый тип (наоборот - нельзя!);
- если T1 - строковый, а T2 - символьный или строковый тип.
Нарушение правил совместимости типов обнаруживается обычно на стадии компиляции и сопровождается выдачей сообщения Type mismatch:
Var
i, j : integer;
x, y : real;
begin
i := 25;
x := 1.25;
y := i; //правильно
j := x; //ошибка
...............
Дата добавления: 2016-05-28; просмотров: 1858;