Глава 5. Константы и переменные




В этой главе описываются константы и переменные в синтаксисе Турбо Паскаля. Во многих случаях правила объявления констант и переменных значительно расширяют стандарт Паскаля и предоставляют программисту нетрадиционные способы обработки данных. Здесь же будут подробно рассмотрены совмещение переменных и описание переменных со стартовыми значениями.

Простые константы

Раздел описания констант CONST программы позволяет вводить различного вида константы. Константы — это не более чем средство для сокращения рутинных действии над текстом программы и одновременно улучшения ее читаемости. Пусть описаны типы:

TYPE

Diapazon = 14..27; { диапазон }

Massiv1 = Array [14..27] of Real; { тип "массив" }

Massiv2 = Array [15..28] of Integer; { другой массив }

Если в приведенный фрагмент вкралась ошибка и надо срочно сдвинуть диапазоны в типах на четыре значения вниз, то придется исправить только в нем шесть цифр. А во всей программе? Чтобы избавиться от конкретных цифр, можно задать их константами:

CONST

Lower = 14;

Upper = 27;

TYPE

Diapason = Lower..Upper;

Massiv1 = Array [Lower..Upper] of Real;

Massiv2 = Array [Lower+1.. Upper+1] of Integer;

Теперь в той же ситуации достаточно поправить два числа. В этом примере Lower и Upper простые константы (есть и сложные разновидности констант, но они рассматриваются совместно с переменными).

Константы вводятся исключительно для удобства программиста. В работающей программе выполнимый код будет одинаков для обоих рассмотренных примеров. Дело в том, что компилятор запоминает {75} все значения простых констант и при трансляции программы заменяет все имена констант на их значения. Именно поэтому простые константы не могут стоять слева в операторе присваивания и вообще не могут изменить свое значение в программе. Они могут участвовать в выражениях, вызовах функций, в операторах циклов, их можно выводить на печать (а вот вводить уже нельзя!), лишь бы не было попыток изменить их значение.

Константы описываются в блоке CONST (или в блоках, если их несколько). Синтаксис их прост:

CONST

ИмяКонстанть1 = Значение1;

ИмяКонстанты2 = Значение2;

и т.п. или

ИмяКонстанты = ЗначениеВыраженияСтоящегоСправа;

Имя и значение константы разделяются знаком равенства «=» (но не знаком присваивания «:=»). После задания константы обязательна точка с запятой. Концом блока констант считается начало любого другого блока или описания процедур и функций.

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

CONST

Min = 0; { константа — целое число }

Мах = 500; { константа — целое число }

е = 2.7; { константа — вещественное число}

SpecChar = '\'; { константа — символ }

HelpStr = 'Нажмите клавишу F1'; { константа — строка }
NoAddress = nil; { константа — адрес }

OK = True; { логическая константа "истинно" }

{ Можно задавать простые константы типа "множество": }

Alpha = [ 'А'..'Я' ];

Обращаем внимание, что тип значения не указывается никоим образом. Он определяется автоматически при анализе значения константы.

Расширением Турбо Паскаля является возможность определять константы как выражения из чисел, некоторых функций языка и определенных ранее простых констант. Так, приведенный список констант можно продолжить следующими примерами: {76}

Interval = Мах - Min + 1;

Key = Chr(27); { символ с кодом 27 }

e2 = е*е;

BigHelpString = HelpStr + 'для подсказки';

Flag = Ptr($0000, $00F0); { задание адреса }

В выражениях могут использоваться все математические операции (+,-,/,*,div,mod), поразрядные (битовые) действия, логические операторы (not, and, or, xor) и операции отношения (=,<,> и т.п., включая операцию in для множеств). Из стандартных функций Турбо Паскаля в выражениях констант могут участвовать только такие:

Abs(X) — абсолютное значение числа X;

Round(X) — округление X до ближайшего целого числа;

Trunc(X) — отсечение дробной части значения X;

Chr(X) — символ с кодом номер X;

Ord(X) — номер значения X в его перечислимом типе;

Pred(X) — значение, предшествующее X в его типе;

Succ(X) — значение, следующее за X в его типе;

Odd(X) — логическая функция проверки нечетности X;

SizeOf (X) — размер типа с именем X;

Length (X) — длина строки X;

Ptr(S,O) — функция задания адреса;

Lo(X), Hi(X) и Swap(X) — операции с машинными словами.

Этот же набор допускается при построении выражений в окнах отладки (Watch и Evaluate).

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

Переменные

Переменные вводятся в программу для хранения и передачи данных внутри нее. Любая переменная имеет имя (идентификатор). По правилам Турбо Паскаля имя переменной должно начинаться с буквы и может содержать буквы (только латинские), цифры и знак подчеркивания. Длина имени — почти любая (до 126 символов), но {77} различаются имена по первым 63 символам. Имена объявляемых в программе переменных должны быть перечислены в блоках описания VAR:

VAR

Имя1: ИмяТипаОднойПеременной;

Имя2: ИмяТипаДругойПеременной;

...

Имя9: КонструкцияТипаПеременной;

Каждому имени переменной в блоке VAR должен ставится в соответствие ее тип. Имя и тип разделяются двоеточием. После объявления и описания переменной должен стоять символ «;». Концом блока описания будет начало какого-либо другого блока программы или описание процедур и функций.

Имя типа может быть именем предопределенного в языке типа или введенного программистом в предыдущем блоке описания типов TYPE. Но разрешается составлять типы по ходу объявления переменных:

VAR

X: Real; { вещественная переменная }

T: Test; { переменная введенного ранее типа Test }

i, j, k: Integer; { три целые переменные }

Subr: 1..10; { целая ограниченная переменная }

Dim: Array [0..99] of Byte; { переменная типа "массив" }

S1, S2, { четыре переменные типа }

S3, S4: Set of Char; { "множество символов" }

PointRec: RECORD

X,Y: Real { запись с двумя полями }

END;

Однотипные переменные могут перечисляться через запятую перед объявлением их типа. Никаких правил умолчания при задании типа (как в Фортране, например) или особого обозначения (как в Бейсике) нет. Все переменные должны быть описаны соответствующим типом.

Переменные подразделяются на глобальные и локальные. Глобальные — это переменные, которые объявлены в разделах VAR вне процедур и функций. Переменные, которые вводятся внутри процедур и функций, называются локальными. Среди глобальных переменных не может быть двух с одинаковым именем. Локальные же переменные, которые известны и имеют смысл только внутри процедур или функций, могут дублировать глобальные имена. При этом внутри подпрограмм {78} все обращения к таким именам соответствуют обращениям к локальным переменным, а вне их — к глобальным. Локальные и глобальные переменные всегда хранятся в разных местах и даже при одинаковых именах не влияют на значения друг друга.

Все глобальные переменные хранят свои значения в так называемом сегменте данных. Его максимальный объем теоретически равен 65520 байт (почти 64К), но практически он всегда меньше на 1...2К. Таким образом, сумма размеров всех объявленных глобальных переменных должна быть меньше, чем 63К. Если этого мало, то используются ссылки и динамические переменные.

Локальные переменные существуют только при работе объявляющих процедур или функций и хранят свои значения в специально отводимой области памяти, называемой стеком. После окончания работы процедуры или функции ее локальные переменные освобождают стек. Размер стека можно менять от 1024 байт (1К) до тех же 65520 байт, используя ключ компилятора $М. По умолчанию он равен 16384 байт (16К). Это максимальный объем всех локальных переменных, работающих одновременно.

Техническая подробность: компилятор Турбо Паскаля отводит место для хранения значений глобальных переменных в сегменте данных последовательно, по мере перечисления имен. Например, объявление

Var

i,j: Byte; {два раза по 1 байту}

D: Array [1..10] of Char; { десять однобайтных элементов}
R: Real; { шесть байтов }

разместит будущие значения переменных, как показано на рис. 5.1. Этот чисто технический момент будет использован впоследствии.

... i j D[1] D[2]...D[10] R ...
           

+1 +(i+1) +(i+1+10*1) +(i+1+10*1*6)

Начало отсчета в байтах

Рис. 5.1

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



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2022-11-01 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: