Program Global;
Uses CRT;
Var a, b, c, s : Integer; с -глобальная переменная
Function Sum(x, y : Integer) : Integer;
Begin
c := c + 1; изменение значения глобальной
Sum := x + y + c; переменной в функции
End;
Begin
a := 1;
b := 1;
c := 1; инициализация глобальной переменной
s := c + Sum(a, b);
WriteLn(‘s=’, s);
ReadLn;
End.
После выполнения этой программы s = 5.
Следует избегать использования глобальных переменных в функциях, так как это может привести к непредсказуемым результатам вычислений. В предыдущем примере значение переменной s определялось оператором присваивания:
s := c + Sum(a, b);
и принимало значение s = 5. Поменяем местами слагаемые в этом операторе присваивания:
s := Sum(a, b) + c;
Казалось бы, результат измениться не должен, но после вычислений получим
s = 6 - значение глобальной переменной c изменилось внутри функции и стало равным с = 2, и с таким значением оно было добавлено в общую сумму в вызывающей программе.
Локальные и глобальные переменные размещаются в оперативной памяти в различных сегментах (частях). При трансляции программы формируются:
· сегмент кода, в котором хранится программа в виде машинных команд,
· сегмент данных, в котором выделяется память под глобальные переменные,
· сегмент стека, предназначенный для размещения локальных переменных:
Размер каждого сегмента не может превышать 64Кбайт. Адреса сегментов хранятся во время выполнения программы в сегментных регистрах:
CS – адрес сегмента кода,
DS – адрес сегмента данных,
SS – адрес сегмента стека.
В связи с размещением в различных сегментах памяти, глобальные и локальные переменные действуют по-разному:
· время жизни глобальных переменных – от начала работы программы до ее завершения,
· если глобальные переменные не были инициализированы явным образом, то есть им не были присвоены начальные значения, то перед началом работы программы они обнуляются,
· время жизни локальных переменных – с момента вызова подпрограммы и до ее окончания,
· значения локальных переменных между двумя вызовами одной и той же подпрограммы не сохраняются,
· неинициализированные локальные переменные предварительно не обнуляются, а принимают произвольные значения, зависящие от информации, оставшейся в занимаемых ими ячейках памяти,
· если переменная внутри подпрограммы определена в разделе описания константConst , то память под нее выделяется не в сегменте стека, а в сегменте данных, причем начальное значение ей присваивается один раз до начала работы программы, а не при входе в подпрограмму:
Function Func(k: Word) : Word;
Const n: Word = 0; n – типизированная константа
Var i: Word;
Begin
WriteLn(‘i=’,i); неопределенное значение переменнойi
WriteLn(‘n=’,n);
n:= n + k;
Func:=n;
End;
Переменной i будет присвоено заранее неизвестное значение. При первом обращении к функции переменная n, определенная в CONST, будет равна нулю, и при каждом последующем обращении она будет увеличиваться на k.
· время жизни такой переменной – время работы всей программы: значения этой переменной сохраняются между вызовами подпрограммы,
· область действия такой переменной – подпрограмма, в которой она описана, то есть вне подпрограммы к этой переменной обратиться нельзя,
10. локальные и глобальные переменные могут совпадать по имени; в этом случае в функции работают локальные переменные,
11. в качестве формальных параметров функций можно использовать имена переменных любого типа, имена массивов, множеств, файлов, записей, комбинированных структур, а также имена ранее определенных функций;
в качестве формальных параметров функций нельзя использовать конкретные значения (числа, символы), элементы массивов, поля записей, выражения и стандартные функции,
12. в качестве фактических параметров функций можно использовать константы, переменные, имена и элементы массивов, множеств, файлов, имена и поля записей, комбинированных структур, а также выражения, стандартные функции и имена ранее описанных функций,
13. значения входных (фактических) параметров функций не изменяются, даже если соответствующие им формальные параметры изменяются внутри функции; такие не изменяющиеся функцией входные переменные называются параметрами-значениями. При использовании параметров-значений в функцию передаются не сами фактические параметры, а их копии. Поэтому сами параметры остаются всегда неизменными:
Дата добавления: 2015-08-08; просмотров: 634;