Локальные и глобальные переменные
Напомним, что каждый
модуль (процедура, функция, программа) состоит из заголовка (procedure…,
function…, program…) и блока.
Если блок какой-либо
процедуры p1 содержит внутри процедуру p2, то говорят, что p2 вложена в p1.
Пример.
procedure p1(x: real; var y:
real);
var c: integer;
procedure p2(var z: real);
…………………….
end;
begin
…………………….
end;
Любые идентификаторы,
введенные внутри какого-либо блока (процедуры, функции) для описания
переменных, констант, типов, процедур, называются локальными для данного блока.
Такой блок вместе с вложенными в него модулями называют областью действия этих
локальных переменных, констант, типов и процедур.
Пример.
procedure t1;
var y1, y2: real;
procedure sq1;
var a, b, c, d: real;
begin
{ Переменные a, b, c, d являются локальными
для sq1,
область их действия – процедура
sq1 }
……………………………………
end;
begin
{ Переменные y1, y2 - нелокальные для
sq1,
область их действия – t1 и sq1 }
end;
Константы, переменные,
типы, описанные в блоке program, называются глобальными. Казалось бы, проще
иметь дело вообще только с глобальными переменными, описав их все в program. Но
использование локальных переменных позволяет системе лучше оптимизировать
программы, делать их более наглядными и уменьшает вероятность появления ошибок.
При написании программ,
имеющих вложенные модули, необходимо придерживаться следующих правил:
Описывать
идентификаторы в том блоке, где они используются, если это возможно.
Если один и тот же
объект (переменная, тип, константа) используются в двух и более блоках, то
описать этот объект надо в самом внешнем из них, содержащем все остальные
блоки, использующие данный объект.
Если переменная,
используемая в процедуре, должна сохранить свое значение до следующего вызова
этой процедуры, то такую переменную надо описать во внешнем блоке, содержащем
данную процедуру.
Локализация переменных
дает программисту большую свободу в выборе идентификаторов. Так, если две
процедуры a и b полностью отделены друг от друга (т.е. не вложены одна в
другую), то идентификаторы в них могут быть выбраны совершенно произвольно, в
частности, могут повторяться. В этом случае совпадающим идентификаторам соответствуют
разные области памяти, совершенно друг с другом не связанные.
Пример.
var k: integer;
procedure a;
var
x, z: real;
begin
{ через x, z обозначены две величины –
локальные переменные для a;
k – глобальная переменная для a }
…………………………………
end;
procedure b;
var x, y: integer;
begin
{ через x, y обозначены две другие
величины –
локальные переменные для b;
k – глобальная переменная для b }
…………………………………
end;
begin
{
k – единственная переменная, которую
можно
использовать в основной ветке программы }
…………………………………
end.
Если один и тот же
идентификатор описан в блоке b и второй раз описан во вложенном в b блоке c, то
надо помнить, что эти два одинаковых идентификатора соответствуют разным
ячейкам памяти.
var
i: integer;
a: real;
procedure p(var
d: real);
var i: integer;
begin
i := 3;
d := i + 10 * d;
end;
begin
a := 2.0;
i := 15;
p(a);
writeln(' i = ', i, ' a = ', a);
readln
end.
Глобальным переменным i
и a отводятся две ячейки памяти. Первыми выполняются операторы a := 2.0 и i :=
15. Затем вызывается процедура p(a). В процессе работы p отводится ячейка для
локальной переменной i и туда засылается число 3. После окончания работы
процедуры p эта ячейка i программой «забывается». После возврата на оператор
writeln программа знает только одну ячейку i – глобальную, т.е. ту, которая
содержит число 15. Поэтому программа выдаст на печать i = 15, a = 23.0, т.к. a
= 3 + 10 * 2.
Если локальная и
глобальная переменная принадлежат к одному и тому же сложному типу, то этот тип
надо описать в разделе type, а сами переменные описывать через этот общий тип.
Пример.
type ab = array[1..3] of
real;
var a: ab;
procedure q;
var
b: ab;
…………………………..
end;
В этом примере
переменные a и b описаны через общий тип ab. Если же локальная и глобальная
переменные описаны одинаково, но не через общий тип, то программа может «не
понять», что эти переменные принадлежат одному типу.
Пример.
var a: array[1..3] of real;
procedure q;
var b: array[1..3] of real;
……………………….
end;
В этом примере
переменные a и b – одинаковые массивы, т.е. типы этих переменных одинаковы, но
программа, тем не менее, «не считает», что a и b принадлежат одному типу. Это
происходит из-за того, что описание массивов дано в разных блоках.
Здесь представлены комментарии некоторых спортивных состязаний, а также оценка вопросов, сыгранных в телевизионных клубах "Что? Где? Когда?" России и Беларуси. Особое внимание будет уделено игровым видам спорта (футбол, хоккей). Найдут для себя полезное и любители шахмат и шахматной композиции.
Здесь представлены лучшие, на наш взгляд, книги по математике, физике, астрономии, информатике, и некоторым другим предметам. Также предлагается подборка научно-популярной литературы и книг по интеллектуальным играм. Здесь указаны ссылки, по которым Вы можете их скачать.