
- •Часть I. Язык Borland Pascal...................................12
- •Глава 1. Что такое программа Borland Pascal?...................12
- •Глава 2. Лексемы...............................................22
- •Глава 3. Константы.............................................32
- •Глава 4. Типы..................................................34
- •Глава 5. Переменные и типизированные константы.................72
- •Глава 6. Выражения.............................................93
- •Глава 7. Операторы............................................117
- •Глава 8. Блоки, локальность и область действия................133
- •Глава 9. Процедуры и функции..................................139
- •Глава 10. Программы и модули..................................170
- •Глава 11. Динамически компонуемые библиотеки..................180
- •Глава 12. Библиотеки исполняющей системы......................194
- •Глава 13. Стандартные процедуры и функции.....................199
- •Глава 14. Ввод и вывод........................................215
- •Глава 15. Использование сопроцессора 80x87....................248
- •Глава 16. Модуль Dоs..........................................259
- •Глава 17. Программирование в защищенном режиме dos............270
- •Глава 18. Строки с завершающим нулем..........................297
- •Глава 19. Использование графического интерфейса Borland.......308
- •Глава 20. Использование оверлеев..............................329
- •Часть III. В среде Borland Pascal.............................348
- •Глава 21. Использование памяти................................348
- •Глава 22. Вопросы управления..................................388
- •Глава 23. Автоматическая оптимизация..........................405
- •Часть IV. Использование Borland Pascal с языком ассемблера....411
- •Глава 24. Встроенный ассемблер................................411
- •Глава 25. Компоновка с программами на языке ассемблера........437
- •Часть II "Библиотеки исполняющей системы" содержит информа-
- •Часть I. Язык Borland Pascal
- •Глава 1. Что такое программа Borland Pascal?
- •Глава 2. Лексемы
- •Глава 3. Константы
- •Глава 4. Типы
Глава 4. Типы
─────────────────────────────────────────────────────────────────
При описании переменной необходимо указать ее тип. Тип пере-
менной описывает набор значений, которые она может принимать, и
действия, которые могут быть над ней выполнены. Описание типа оп-
ределяет идентификатор, который обозначает этот тип.
┌───────────────┐ ┌───┐ ┌─────┐ ┌───┐
описание ──>│ идентификатор ├──>│ = ├──>│ тип ├──>│ ; ├──>
типа └───────────────┘ └───┘ └─────┘ └───┘
Указание идентификатора в левой части описания типа означа-
ет, что он определен как идентификатор типа для блока, в котором
указано это описание типа. Область действия идентификатора типа
не включает его самого, исключение составляют типы "указатель"
(которые называют также ссылочными типами).
┌────────────────────┐
тип ────────┬────>│ простой тип │─────────>
│ └────────────────────┘ ^
│ ┌────────────────────┐ │
├────>│ строковый тип ├────┤
│ └────────────────────┘ │
│ ┌────────────────────┐ │
├────>│ ссылочный тип ├────┤
│ └────────────────────┘ │
│ ┌────────────────────┐ │
├────>│ структурный тип ├────┤
│ └────────────────────┘ │
│ ┌────────────────────┐ │
├────>│ процедурный тип ├────┤
│ └────────────────────┘ │
│ ┌────────────────────┐ │
└────>│ идентификатор типа ├────┘
└────────────────────┘
Имеется пять следующих основных классов типов. Они описыва-
ются в следующем разделе.
B.Pascal 7 & Objects/LR - 35 -
Простые типы
─────────────────────────────────────────────────────────────────
Простые типы определяют упорядоченные множества значений.
┌───────────────────┐
простой тип ─────┬────>│ порядковый тип ├─────────>
│ └───────────────────┘ ^
│ ┌───────────────────┐ │
└────>│ вещественный тип ├─────┘
└───────────────────┘
┌────────────────────┐
вещественный тип ─────>│ идентификатор ├─────>
│ вещественного типа │
└────────────────────┘
Идентификатор вещественного типа относится к числу стандарт-
ных идентификаторов, которые могут быть вещественными, с одинар-
ной точностью, с двойной точностью, с повышенной точностью и
сложными.
Примечание: В разделах "Числа" и "Строковые константы"
Главы 2 вы можете найти описание того, как обозначать конс-
танты целого и вещественного типов.
Порядковые типы
─────────────────────────────────────────────────────────────────
Порядковые типы представляют собой подмножество простых ти-
пов. Все простые типы, отличные от вещественных типов, являются
порядковыми и выделяются по следующим четырем характеристикам.
- Все возможные значения данного порядкового типа представ-
ляют собой упорядоченное множество, и каждое возможное
значение связано с порядковым номером, который представ-
ляет собой целочисленное значение. За исключением значе-
ний целочисленного типа, первое значение любого порядко-
вого типа имеет порядковый номер 0, следующее значение
имеет порядковый номер 1 и так далее для каждого значения
в этом порядковом типе. Порядковым номером значения цело-
численного типа является само это значение. В любом по-
рядковом типе каждому значению, кроме первого, предшест-
вует другое значение, и после каждого значения, кроме
последнего, следует другое значение в соответствии с упо-
рядоченностью типа.
- К любому значению порядкового типа можно применить стан-
дартную функцию Ord, возвращающую порядковый номер этого
значения.
- К любому значению порядкового типа можно применить стан-
дартную функцию Pred, возвращающую предшествующее этому
значению значение. Если эта функция применяется к первому
B.Pascal 7 & Objects/LR - 36 -
значению в этом порядковом типе, то выдается сообщение об
ошибке.
- К любому значению порядкового типа можно применить стан-
дартную функцию Succ, возвращающую следующее за этим зна-
чением значение. Если эта функция применяется к последне-
му значению в этом порядковом типе, то выдается сообщение
об ошибке.
- К любому значению порядкового типа и к ссылке на перемен-
ную порядкового типа можно применить стандартную функцию
Low, возвращающую наименьшее значение в диапазоне данного
порядкового типа.
- К любому значению порядкового типа и к ссылке на перемен-
ную порядкового типа можно применить стандартную функцию
High, возвращающую наибольшее значение в диапазоне данно-
го порядкового типа.
Синтаксис порядкового типа имеет следующий вид:
┌────────────────────┐
порядковый ─────┬────>│ отрезок типа ├─────────>
тип │ └────────────────────┘ ^
│ ┌────────────────────┐ │
├────>│ перечислимый тип ├─────┤
│ └────────────────────┘ │
│ ┌────────────────────┐ │
└────>│ идентификатор ├─────┘
│ порядкового типа │
└────────────────────┘
Borland Pascal имеет 10 встроенных порядковых типов: Integer
(целое), Shortint (короткое целое), Longint (длинное целое), Byte
(длиной в байт), Word (длиной в слово), Boolean (булевское),
ByteBool (булевское размером в байт), WordBool (булевское разме-
ром в слово), LongBool (длинный булевский тип) и Char (символьный
тип). Кроме того, имеется два других класса определяемых пользо-
вателем порядковых типов: перечислимые типы и отрезки типов (под-
диапазоны).
B.Pascal 7 & Objects/LR - 37 -
Целочисленные типы
─────────────────────────────────────────────────────────────────
В Borland Pascal имеется пять предопределенных целочисленных
типов: Shortint (короткое целое), Integer (целое), Longint (длин-
ное целое), Byte (длиной в байт) и Word (длиной в слово). Каждый
тип обозначает определенное подмножество целых чисел, как это по-
казано в следующей таблице.
Предопределенные целочисленные типы Таблица 4.1
┌────────────────────┬────────────────────┬─────────────────────┐
│ Тип │ Диапазон │ Формат │
├────────────────────┼────────────────────┼─────────────────────┤
│ короткое целое │ -128 .. 127 │ 8 бит со знаком │
│ (Shortint) │ │ │
├────────────────────┼────────────────────┼─────────────────────┤
│ целое │ -32768 .. 32767 │ 16 бит со знаком │
│ (Integer) │ │ │
├────────────────────┼────────────────────┼─────────────────────┤
│ длинное целое │ -2147483648 .. │ 32 бита со знаком │
│ (Longint) │ ..2147483647 │ │
├────────────────────┼────────────────────┼─────────────────────┤
│ длиной в байт │ 0 .. 255 │ 8 бит без знака │
│ (Byte) │ │ │
├────────────────────┼────────────────────┼─────────────────────┤
│ длиной в слово │ 0 .. 65535 │ 16 бит без знака │
│ (Word) │ │ │
└────────────────────┴────────────────────┴─────────────────────┘
Арифметические действия над операндами целочисленного типа
предполагают 8-битовую, 16-битовую и 32-битовую точность в соот-
ветствии со следующими правилами:
- Тип целой константы представляет собой встроенный целочис-
ленный тип с наименьшим диапазоном, включающим значение
этой целой константы.
- В случае бинарной операции (операции, использующей два
операнда), оба операнда преобразуются к их общему типу пе-
ред тем, как над ними совершается действие. Общим типом
является встроенный целочисленный тип с наименьшим диапа-
зоном, включающим все возможные значения обоих типов. Нап-
ример, общим типом для целого и целого длиной в байт явля-
ется целое, а общим типом для целого и целого длиной в
слово является длинное целое. Действие выполняется в соот-
ветствии с точностью общего типа и типом результата явля-
ется общий тип.
- Выражение справа в операторе присваивания вычисляется не-
зависимо от размера или типа переменной слева.
- Любые операнды размером в байт преобразуются к промежуточ-
ному операнду размером в слово, который совместим перед
B.Pascal 7 & Objects/LR - 38 -
выполнением арифметической операции с типами Integer и
Word.
Значение одного целочисленного типа может быть явным образом
преобразовано к другому целочисленному типу с помощью приведения
типов.
Примечание: Приведение типов описывается в Главах 5 и 6.
B.Pascal 7 & Objects/LR - 39 -
Булевские типы
─────────────────────────────────────────────────────────────────
Существует 4 предопределенных булевских типа: Boolean,
ByteBool, WordBool и LongBool. Значения булевского типа обознача-
ются встроенными идентификаторами констант False и True. Посколь-
ку булевский тип является перечислимым, между этими значениями
имеют место следующие отношения:
- False < True
- Ord(False) = 0
- Ord(True) = 1
- Succ(False) = True
- Pred(True) = False
Переменные типа Boolean и ByteBool занимают 1 байт, пере-
менная WordBool занимает два байта (слово), а переменная LongBool
занимает четыре байта (два слова). Boolean - это наиболее предпо-
чтительный тип, использующей меньше памяти; типа ByteBool,
WordBool и LongBool обеспечивают совместимость с другими языками
и средой Windows.
Предполагается, что переменная типа Boolean имеет порядковые
значения 0 и 1, но переменные типа ByteBool, WordBool и LongBool
могут иметь другие порядковые значения. Когда выражение типа
ByteBool, WordBool или LongBool равна 1, то подразумевается, что
она имеет значение True, а если оно равно 0 - то False. Когда
значение типа ByteBool, WordBool или LongBool используется в кон-
тексте, где ожидается значение Boolean, компилятор будет автома-
тически генерировать код, преобразующий любое ненулевое значение
в значение True.
B.Pascal 7 & Objects/LR - 40 -
Символьный тип (char)
─────────────────────────────────────────────────────────────────
Множеством значений этого типа являются символы, упорядочен-
ные в соответствии с расширенным набором символов кода ASCII. При
вызове функции Ord(Ch), где Ch - значение символьного типа, возв-
ращается порядковый номер Ch.
Строковая константа с длиной 1 может обозначать значение
константы символьного типа. Любое значение символьного типа может
быть получено с помощью стандартной функции Chr.
Перечислимые типы
─────────────────────────────────────────────────────────────────
Перечислимые типы определяют упорядоченные множества значе-
ний через перечисление идентификаторов, которые обозначают эти
значения. Упорядочение множеств выполняется в соответствии с пос-
ледовательностью, в которой перечисляются идентификаторы.
┌───┐ ┌───────────────┐ ┌───┐
перечислимый ──>│ ( ├───>│ список ├───>│ ) ├───>
тип └───┘ │идентификаторов│ └───┘
└───────────────┘
список ┌─────────────┐
идентификаторов ────────>│идентификатор├───┬────>
^ └─────────────┘ │
│ ┌───┐ │
└──────┤ , │<───────────┘
└───┘
При указании идентификатора в списке идентификаторов пере-
числимого типа он описывается как константа для блока, в котором
указано описание перечислимого типа. Типом этой константы являет-
ся описанный перечислимый тип.
Порядковый номер перечислимой константы определяется ее по-
зицией в списке идентификаторов при описании. Перечислимый тип, в
котором описывается константа, становится ее типом. Первая пере-
числимая константа в списке имеет порядковый номер 0.
Приведем пример перечислимого типа:
type
suit = (club, diamond, heart, spade);
Согласно этим описаниям diamond является константой типа
suit.
При применении функции Ord к значению перечислимого типа Ord
возвращает целое число, которое показывает, какое положение зани-
мает это значение в отношении других значений этого перечислимого
B.Pascal 7 & Objects/LR - 41 -
типа. Согласно предшествующим описаниям, Ord(club) возвращает 0,
Ord(diamond) возвращает 1 и так далее.
Отрезки типа
─────────────────────────────────────────────────────────────────
Отрезок типа представляет собой диапазон значений из поряд-
кового типа, называемого главным типом. Определение отрезка типа
включает наименьшее и наибольшее значение в поддиапазоне. Оно
имеет следующий синтаксис:
отрезок ┌───────────┐ ┌────┐ ┌───────────┐
типа ───────────>│ константа ├───>│ .. ├───>│ константа ├───>
└───────────┘ └────┘ └───────────┘
Обе константы должны иметь один и тот же порядковый тип. От-
резки типов, имеющие вид a..b, предполагают, что a меньше или
равно b.
Приведем примеры отрезков типов:
0..99
-128..127
club..heart
Переменная отрезка типа имеет все свойства переменных глав-
ного типа, однако ее значение на этапе выполнения должно принад-
лежать указанному интервалу.
Разрешение использования выражений-констант там, где стан-
дартный Паскаль допускает только простые константы, приводит к
некоторой синтаксической неоднозначности. Рассмотрим следующие
описания:
const
X = 50;
Y = 10;
type
Color = (Red, Green, Blue);
Scale = (X - Y) * 2..(X + Y) * 2;
Согласно синтаксису стандартного Паскаля, если определение
типа начинается с круглой скобки, то это перечислимый тип (такой
как Color в данном примере). Однако Scale предназначен для опре-
деления отрезка типа. Решение состоит в том, чтобы переупорядо-
чить первое выражение поддиапазона или задать другую константу,
равную значению данного выражения, и использовать эту константу в
определении типа:
type
Scale = 2 * (X - Y)..(X + Y);