Этот шаг посвящен объяснению правил, регламентирующих видимость объектов, в частности,
переменных в подпрограммах.
Вы, наверное, обратили внимание на то, что в приведенных в предыдущих шагах подпрограммах нигде не использовались переменные с именами, которые бы совпадали с именами переменных, размещенных в основной программе. Однако на практике очень часто можно встретить совпадение имен переменных, описанных в основной программе и подпрограмме. Как же в этом случае поступает компилятор? Как он различает эти переменные? Значения каких переменных он использует? Разъяснению этих вопросов как раз посвящен этот шаг.
Еще раз подчеркнем, что подпрограмма - это самостоятельная часть программы, имеющая собственные переменные, которым отводится отдельное место в памяти компьютера. Этим объясняется тот факт, что переменные с одинаковыми именами, используемые в подпрограмме и в основной программе, являются разными (в программе, иллюстрирующей передачу параметров по ссылке, - переменные Sk и Sp основной программы и параметры Sk и Sp процедур). При выполнении программы машина "не путает" имена этих переменных, так как области их действия не совпадают.
Существуют следующие правила, регламентирующие видимость имен переменных.
1. Имена переменных, описанных в некоторой подпрограмме, считаются известными в пределах данной подпрограммы, включая и все вложенные подпрограммы.
Приведем пример программы, иллюстрирующий это правило (рис.1):
Рис.1. Видимость переменной из основной программы в подпрограмме
2. Имена переменных, описанных в подпрограмме, должны быть разными в пределах данной подпрограммы и могут совпадать с именами переменных из других подпрограмм.
На рисунке 2 приведена программа, иллюстрирующая это правило:
Рис.2. Использование одинаковых имен переменных в разных подпрограммах
Таким образом, видимость переменной, созданной в подпрограмме, ограничивается рамками этой подпрограммы. Следовательно, можно при создании подпрограмм использовать одинаковые имена при описании переменных.
3. Пусть вторая подпрограмма вызывается из первой. Во второй подпрограмме описана переменная с именем, которое существует в первой подпрограмме. Тогда переменная из второй подпрограммы делает "невидимой" (недоступной) переменную из первой подпрограммы.
Проиллюстрируем это правило программой на рисунке 3:
Рис.3. "Экранирование" переменных
Из анализа приведенной программы можно сделать вывод, что переменная x, расположенная
в подпрограмме, делает недоступной аналогичную переменную, расположенную в основной
программе. Чтобы быть уверенным, что в подпрограмме будет доступна переменная, описанная в
основной программе, ее значение нужно передавать явным образом, используя механизм
формальных и фактических параметров.
На следующем шаге мы рассмотрим еще несколько интересных моментов, связанных с
подпрограммами.