Мы поможем в написании ваших работ!



ЗНАЕТЕ ЛИ ВЫ?

Область действия идентификатора

Поиск

Описание переменных

Переменные могут быть описаны в разделе описаний, а также непосредственно внутри любого блока begin/end.

Раздел описания переменных начинается со служебного слова var, после которого следуют элементы описания вида

список имен: тип; или имя: тип := выражение;   или имя := выражение;

Имена в списке перечисляются через запятую. Например:

var
a,b,c: integer; d: real := 3.7; 

s := 'Pascal forever'; al := new ArrayList; p1 := 1;

В последних трех случаях тип переменной определяется по типу правой части.

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

begin
var
a1,a2,a3: integer;     var s := '';
...
end
.

Кроме того, переменные-параметры цикла могут описываться в заголовке операторов for и foreach.

Описание констант

Раздел описания именованных констант начинается со служебного слова const, после которого следуют элементы описания вида

имя константы = значение;

или

имя константы : тип = значение;

Например:

const
Pi = 3.14;
Count = 10;
Name = 'Mike';
DigitsSet = ['0'..'9'];
Arr: array [1..5] of integer = (1,3,5,7,9);
Rec: record name: string; age: integer end = (name: 'Иванов'; age: 23);
Arr2: array [1..2,1..2] of real = ((1,2),(3,4));

Описание меток

Раздел описания меток начинается с зарезервированного слова label, после которого следует список меток, перечисляемых через запятую. В качестве меток могут быть использованы идентификаторы и положительные целые числа:

label a1,l2,777777;

Описание типов

Раздел описания типов начинается со служебного слова type, после которого следуют строки вида

имя типа = тип;

Например,

type
myint = integer;
arr10 = array [1..10] of integer;
pinteger = ^integer;
A = class
i: integer;
constructor Create(ii: integer);
begin
i:=ii;
end;
end;

При описании рекурсивных структур данных указатель на тип может фигурировать раньше описания самого типа в определении другого типа:

type
PNode = ^TNode;
TNode = record
data: integer;
next: PNode;
end;

При этом важно, чтобы определения обоих типов находились в одном разделе type.

В отличие от Delphi Object Pascal следующее рекурсивное описание верно:

type
TNode = record
data: integer;
next: ^TNode;
end;

Отметим, что для ссылочных типов (классов) разрешается описание поля с типом, совпадающим с типом текущего класса:

type
Node = class
data: integer;
next: Node;
end;

Любой используемый в блоке идентификатор должен быть предварительно описан. Идентификаторы описываются в разделе описаний. Идентификаторы для переменных могут также описываться внутри блока.

Основная программа, подпрограмма, блок, модуль, класс образуют так называемое пространство имен - область в программе, в которой имя должно иметь единственное описание. Таким образом, в одном пространстве имен не может быть описано двух одинаковых имен (исключение составляют перегруженные имена подпрограмм). Кроме того, в сборках .NET имеются явные определения пространств имен.

Область действия идентификатора (т.е. место, где он может быть использован) простирается от момента описания до конца блока, в котором он описан. Область действия глобального идентификатора, описанного в модуле, простирается на весь модуль, а также на основную программу, к которой данный модуль подключен в разделе uses.

Кроме этого, имеются переменные, определенные в блоке и связанные с некоторыми конструкциями (for, foreach). В этом случае действие переменной i простирается до конца соответствующей конструкции. Так, следующий код корректен:

vara: array of integer := (3,5,7);
for
i: integer := 1 to 9 do
write(a[i]);
foreach i: integer in a do
write(i);

Идентификатор с тем же именем, определенный во вложенном пространстве имен, скрывает идентификатор, определенный во внешнем пространстве имен. Например, в коде

vari: integer;

procedure p;
var i: integer;
begin
i := 5;
end;

значение 5 будет присвоено переменной i, описанной в процедуре p; внутри же процедуры p сослаться на глобальную переменную i невозможно.

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

var i: integer;
begin
var i: integer; // ошибка
end.

В производных классах, напротив, можно определять члены с теми же именами, что и в базовых классах, при этом их имена скрывают соответствующие имена в базовых классах. Для обращения к одноименному члену базового класса из метода производного класса используется ключевое слово inherited:



Поделиться:


Последнее изменение этой страницы: 2024-06-27; просмотров: 2; Нарушение авторского права страницы; Мы поможем в написании вашей работы!

infopedia.su Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Обратная связь - 3.144.3.235 (0.005 с.)