Область дії означень та побічний ефект
Програма може містити кілька підпрограм, і в них самих можуть бути підпрограми тощо. Виникає питання, чи можна в одній підпрограмі використовувати імена, означені в іншій? І зокрема, чи можна в підпрограмах користуватися іменами з програми, і навпаки? У цьому параграфі ми дамо відповіді на ці та деякі інші питання.
Означення імені задає позначення деякого об'єкта, наприклад, змінної або підпрограми. Так, після означення
var aaa : integer;
ім'я aaa позначає змінну цілого типу, а не сталу або щось інше. Таке завдання позначення об'єкта називається його іменуванням. Виникає питання, чи можна різні об'єкти іменувати однаково, тобто давати їм те саме ім'я? Виявляється, можна, але не завжди. Уточнимо це, увівши нове поняття.
Область дії означення імені, або область дії іменування – це сукупність місць у програмі, де ім'я позначає об'єкт, указаний саме в цьому означенні. Область дії іменування часто називають "область дії імені", що не зовсім точно.
За правилами мови Паскаль, означення імені діє від того місця програми або підпрограми, де воно записано, до кінця її блоку. Якщо в цій області є підпрограми, то означення діє й у них. Але якщо вони містять своє власне означення цього імені, то за тими самими правилами до кінця їх блоків діють їх власні означення.
Можна сказати, що власне означення в підпрограмі "перекриває" означення, записане вище.
Приклад 7.1. У програмі
program twovarst(input, output);
var t:integer; {1}
procedure plus; {1}
procedure minus; {1}
begin t:=t-1 end; {1}
var t:integer; {2}
begin t:=1; t:=t+1; minus end; {2}
begin t:=1; plus; writeln(t) end. {1}
коментарі {1} і {2} позначають перше й друге означення імені t й відповідні рядки програми, у яких вони діють. При виконанні виклику процедури minus зменшується значення змінної, означеної в програмі, а при виконанні операторів процедури plus збільшується значення зовсім іншої змінної – іменованої в означенні {2}. Означення {1} перекрите в процедурі plus її власним означенням {2}. Тому при виконанні програми друкується 0.
Таким чином, різні об'єкти можна іменувати однаково, але в різних підпрограмах (однією з них вважається програма). В означеннях тієї самої підпрограми усі імена повинні бути різними.
Тепер підійдемо з протилежного боку. Нехай у деякому місці програми використовується ім'я. Як дізнатися, якому з означень, записаних вище, воно відповідає?