Типизированные константы (переменные со стартовым значением) могут быть и глобальными, и локальными, как любые другие переменные. Но даже если объявляется переменная со значением внутри процедуры, т.е. заведомо локальная, то ее значение будет размещено не в стеке, а в сегменте данных. (Об этом подробнее см. разд. 6.9.6.2 «Статические локальные переменные».)

Особенностью компилятора Турбо Паскаль (точнее, его редактора связей — компоновщика) является то, что в выполнимый код программы не входят те переменные, которые объявлены, но не используются. То же самое имеет место и для типизированных констант. Но минимальным «отсекаемым» компоновщиком куском текста программы может быть лишь блок описания CONST или VAR. Поэтому, если заведомо известно, что не все объявляемые переменные будут использоваться одновременно, лучше разбивать их на различные блоки объявлений:

- 85 -

| VAR

| x1, х2, хЗ : Real;

| VAR

| y1, y2, y3 : Integer;

| CONST

| Dim1 : Array [4..8] of Char = '4567';

| CONST

| Dim10tladka : Array [1..10] of Char = '0123456789';

и т.д.

Смысл программы это не изменит, а компоновщик сможет доказать свою эффективность.

<p>5.3. Операция присваивания и совместимость типов и значений</p>

Если в программе объявлены переменные, то подразумевается, что они будут получать свои значения по ходу ее выполнения. Единственный способ поместить значение в переменную — это использовать операцию присваивания в программе:

Переменная := Значение;

Оператор присваивания — это составной символ «:=». Его можно читать как «становится равным». В операции присваивания слева всегда стоит имя переменной, а справа — то, что представляет собой ее значение (значение как таковое или выражение либо вызов функции, но может быть и другая переменная). После выполнения присваивания переменная слева получает новое значение.

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

Очевидно, что не может быть проблем с присваиванием, если типы переменной и значений идентичны (тождественны). Два типа Type1 и Туре2 считаются идентичными, если:

1. Типы Type1 и Туре2 описаны одним и тем же идентификатором типа, например:

| TYPE

| Тype1 = Boolean;

| Type2 = Boolean;

здесь Type1 и Type2 идентичны. Но в случае

- 86 -

| TYPE

| Type1 = Array [1..2] of Boolean;

| Type2 = Array [1..2] of Boolean;

типы Type1 и Type2 не будут идентичными, поскольку конструкции Array...of..., хотя и одинаковы, но не являются идентификаторами, т.е. обособленными именами. Переменные типов Type1 и Type2 не смогут в последнем случае обмениваться значениями.

2. Типы Type1 и Type2 описаны как эквивалентные. Это означает, что, например, при описании

| TYPE

| Type1 = Array [1..2] of Boolean;

| Type2 = Type1;

| Type3 = Type2;

значения типов Type1, Type2 и Type3 будут полностью совместимы. Аналогичная картина возникает и при объявлении переменных. Если переменные причислены к одному и тому же типу

VAR

x1, x2, xЗ : Type1;

то они совместимы. Если Type1 — идентификатор типа, а не конструкция, то совместимость сохранится и при объявлении вида

| VAR

| x1 : Type1;

| x2 : Type1;

| x3 : Type2;

Здесь Type2 идентичен типу Type1, но будут несовместимы переменные x1 и x2:

| VAR

| x1 : Array [1..2] of Real;

| x2 : Array [1..2] of Real;

Ограничения на совместимость только по идентичным типам было бы слишком жестким. Поэтому совместимость в Турбо Паскале трактуется несколько шире. Так, типы считаются совместимыми, если:

— оба типа являются одинаковыми;

— оба типа являются вещественными типами;

— оба типа являются целочисленными;

- 87 -

— один тип является поддиапазоном другого;

— оба типа являются поддиапазонами одного и того же базового типа;

— оба типа являются множественными типами с совместимыми базовыми типами;

— один тип является строковым, а другой тип — строковым или символьным типом;

— один тип является указателем (Pointer), а другой — указателем или ссылкой.

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

Существует еще один вид совместимости: совместимость по присваиванию, т.е. правила присваивания значения V2 (собственно значение, переменная или выражение) переменной V1. Они действительны только для операций присваивания и являются немногим более широкими, чем правила совместимости по типам. Значение V2 типа Type1 может быть присвоено переменной V1 типа Type2, если выполняется одно из условий:

1. Type1 и Type2 — тождественные типы, и ни один из них не является файловым типом или структурным типом, содержащим компонент с файловым типом.

2. Type1 и Type2 — совместимые перечислимые типы, и значения типа Type2 попадают в диапазон возможных значений Type1.

3. Type1 и Type2 — вещественные типы, и значения типа Type2 попадают в диапазон возможных значений Typel.

Перейти на страницу:

Поиск

Похожие книги