|
Для любого вхождения идентификатора в программу (так назы-вается появление идентификатора в каком-либо месте программы) его роль в этом месте может быть установлена следующим образом. Выбирается самый внутренний из всех блоков, охватывающих это вхождение, в которых локализован данный идентификатор. Если таких блоков нет, то этот идентификатор может быть только идентификатором, закрепленным за некоторым стандартным объектом (см. стр. 128), и тогда его роль определена независимо от программы. В противном случае идентификатор в рассматриваемом вхождении представляет тот же объект, что в выбранном блоке. Выполнение блока состоит в том, что создаются локальные объекты, представленные всеми описанными в начале блока идентификаторами (в этот момент и определяются границы индексов массивов), а затем начинают выполняться внутренние операторы этого блока в том порядке, в каком они написаны. Некоторые операторы (операторы перехода — см. § 7) могут изменить этот порядок. Выполнение блока завершается либо естественным путем, когда выполнен последний из его внутренних операторов, либо в результате перехода к одной из меток, расположенных вне блока. В обоих случаях все локальные объекты блока перестают существовать для программы. Предположим, что других блоков, описаний и операторов присваивания с идентификаторами а, & и с в левой части в программе нет. Тогда идентификатор а локален в блоке ВО, глобален в блоках В1 и В2 и всюду представляет одну и ту же вещественную переменную. Идентификатор Ъ локален в блоках ВО и В1 и представляет целую переменную в блоке SO и вещественную (совсем другую) переменную в блоке Bi. В блоке В2 этот идентификатор глобален и представляет ту же целую переменную, что в блоке ВО. Идентификатор с локален во всех трех блоках и всюду представляет логические переменные, но эти переменные — разные. Идентификатор d локален в блоке В2 и не имеет смысла (не может быть использован) в блоках ВО и В1. Продолжая пример, рассмотрим оператор а: = if с then b else 4 Он находится в блоке ВО, поэтому идентификатор с обозначает в нем ту переменную, которая в этом же блоке получила значение true. Присваивание с: = false было выполнено в блоке В1, и следовательно, значение false получила другая переменная, уже прекратившая свое существование к моменту выполнения рассматриваемого оператора. Таким образом этот оператор присваивает переменной а текущее значение переменной Ь. Это значение из тех же соображений равно 2 (а не 3).
|