Песни о Паскале | страница 69
>const c1 = ’Глобальная’;
>procedure Local;
>begin
> Writeln(c1);
>end;
>begin {--- главная программа ---}
> Local;
> Writeln(c1);
> Readln;
>end.
Очевидно, программа дважды напечатает константу C1, – проверьте меня. Теперь добавим объявление локальной константы с тем же именем C1, поместив его между заголовком процедуры Local и её телом. К совпадающим именам я прибегнул не от бедности фантазии, – мой умысел скоро прояснится.
>const c1 = ’Глобальная’;
>procedure Local;
>const c1 = ’Локальная’;
>begin
> Writeln(c1);
>end;
>begin {--- главная программа ---}
> Local;
> Writeln(c1);
> Readln;
>end.
Известно, что компилятор не допускает совпадающих имен, но здесь – иное дело. Локальная константа C1 «спряталась» внутри своей процедуры и, как говорят программисты, не видна за её пределами.
Запустив на выполнение этот вариант программы, вы убедитесь, что внутри процедуры будет напечатана локальная константа, а в главной программе – глобальная. Отсюда следуют два правила, имеющих силу для констант, переменных и других объектов, о которых вы со временем узнаете. Правила эти таковы:
• локальные объекты (константы, переменные и прочие) видны лишь внутри тех подпрограмм, в которых они объявлены;
• при совпадении имен локального и глобального объектов, внутри подпрограммы имеет силу локальный объект; при этом глобальный объект скрывается локальным.
С учетом сказанного нашу неработающую программу можно исправить так:
>{ P_20_1 – вариант программы с локальной переменной }
>var S: string; k: integer; { глобальная переменная }
>procedure Scan(arg : string);
>var k: integer; { локальная переменная }
>begin
> for k:=1 to Length(arg) do
> if arg[k]=’A’ then arg[k]:=’B’;
>end;
>begin { главная программа }
> for k:=1 to 3 do begin
> Write(’Введите строку: ’); Readln(S);
> Scan(S);
> Writeln(S);
> end;
>end.
Теперь совпадение имен локальной и глобальной переменных k не нарушает работу программы, поскольку это разные переменные. Они могли бы иметь даже разные типы! Убедитесь, что отныне путаницы в циклах нет.
Локальные объекты – константы, переменные и прочие – отличное средство для разумного распределения данных в пространстве вашей программы.
Во-первых, они облегчают многотрудную жизнь программиста. Если некоторые объекты нужны только внутри процедуры, их следует объявить там же, то есть как локальные. И тогда не придется гадать, повлияют ли они на другие части программы.