Структура программы. Стандартные типы данных (теория)
.pdfСтандартные типы данных
В дальнейшем в тексте программы с типизированными константами можно обращаться как с обычными переменными, изменяя, когда требуется, их значения (соответствующая директива компилятора $J+ устанавливается по умолчанию).
2.7. Переменные
Переменная – идентификатор, обозначающий некоторую область в памяти, в которой хранится значение переменной. Это значение может изменяться в ходе выполнения программы. Раздел объявления переменных имеет вид:
var
<список идентификаторов переменных>: <тип>;
Можно указывать не одно, а множество объявлений переменных. Каждое объявление в списке может содержать список идентификаторов переменных, разделяемых запятыми, или один идентификатор. Указываемый в объявлении тип может быть одним из встроенных типов, типом, ранее определенным программистом, или непосредственным описанием вводимого программистом типа.
Переменные можно разделить на локальные и глобальные. Переменные, объявляемые в процедурах или функциях, являются локальными. Они существуют только во время выполнения соответствующей подпрограммы. Память для них выделяется только при вызове подпрограммы и освобождается при возврате в вызывающий модуль. Переменные, объявленные вне процедур или функций, являются глобальными.
Можно создавать динамические переменные, выделяя для них место в динамически распределяемой области памяти.
~ 21 ~
Стандартные типы данных
2.8. Инициализация переменных
Тип переменных определяется пользователем в разделе описания переменных. В откомпилированной программе для всех переменных отведено место в памяти, и всем переменным присвоены нулевые значения.
Инициализация переменных (задание начальных значений переменным) производится одновременно с их описанием. Для этого в стандарте языка Pascal используется конструкция вида имя переменной: тип = значение; которая должна быть размещена в разделе описания констант, например:
const
rWeight: real = 0.4;
В 32-разрядных версиях Delphi глобальные переменные можно инициализировать при объявлении. Инициализированная переменная получает присвоенное ей значение один раз – в начале выполнения программы. Потом же она хранит последнее присвоенное ей значение. Синтаксис инициализации:
var
имя: тип = значение;
Локальные переменные (описываемые в теле подпрограммы) подобным образом инициализировать нельзя. Но им можно присвоить начальные значения, используя локальные типизированные константы.
~ 22 ~
Стандартные типы данных
2.9. Совместимость и преобразование типов
Как и в стандарте языка Pascal, в Object Pascal и Delphi определены понятия эквивалентности и совместимости типов.
Два типа Т1 и Т2 являются эквивалентными (идентичными), если выполняется одно из двух условий:
Т1 и Т2 представляют собой одно и то же имя типа;
тип Т2 описан с использованием типа Т1 с помощью равенства
или последовательности равенств. Например:
type
T1 = integer;
T2 = T1;
T3 = T2;
Менее строгие ограничения определены совместимостью типов. Например, типы являются совместимыми, если:
они эквивалентны;
оба типа являются вещественными типами;
оба типа являются целыми типами;
один тип является поддиапазоном другого;
оба типа являются отрезками одного и того же базового типа;
оба типа являются множественными с совместимыми базовыми типами;
один тип – этот тип Pointer, а другой – любой ссылочный тип.
Кроме этого, существует понятие совместимости по присваиванию. По стандарту ISO 7185 значение типа T1 совместимо по присваиванию с типом T2 (то есть допустимым является оператор присваивания T1:=T2;),
если выполняется одно из следующих условий:
~ 23 ~
Стандартные типы данных
T1 и T2 имеют тождественные типы и ни один из них не является файловым типом или структурным типом, содержащим компонент с файловым типом на одном из своих уровней;
T1 и T2 являются совместимыми порядковыми типами и значения
T2 попадают в диапазон возможных значений T1;
T1 и T2 являются вещественными типами и значения T2 попадают в диапазон T1;
T1 является вещественным типом, а T2 является целочисленным типом;
T1 и T2 являются строковыми типами;
T1 является строковым типом, а T2 является символьным типом;
T1 и T2 являются совместимыми множественными типами и все члены значения типа T2 попадают в диапазон возможных значений
T1;
T1 и T2 являются совместимыми типами указателей;
Ограничения на совместимость типов можно обойти с помощью приведения типов. Пусть два типа (Type1 и Type2) имеют одинаковый размер (занимают в памяти одинаковое количество байт).
var
x: Type1; y: Type2; begin
y:=Type2(x); {x интерпретируется как значение типа Type2} end.
Допускается выполнять и приведение типа значения. Приведение типа значения производится с помощью конструкции вида:
Имя_типа(выражение).
Типы выражения и задаваемый тип должны быть перечисляемыми типами или указателями. Для перечисляемых типов результирующее значение получается путем преобразования выражения и его проверки
~ 24 ~
Стандартные типы данных
на нахождение в допустимых границах. Преобразование может привести к усечению или увеличению размера исходного значения в том случае, если результирующий тип отличается от типа выражения. В том случае, когда значение расширяется, его знак всегда сохраняется. Приведение типа значения не должно встречаться в левой части оператора.
Например, приведение типа integer('A') даст значение кода символа 'A' в двухбайтном представлении целого числа (значение 65), а byte(534) даст значение 22, поскольку целое число 534 имеет тип word и занимает два байта, а тип byte занимает один байт, и в процессе приведения старший байт будет отброшен, boolean(0) – false.
~ 25 ~