Откуда компилятор знает, что это выходит за рамки? - PullRequest
0 голосов
/ 18 мая 2011
Main()
{
  int i =0;
  ...
  ...
  while(true)
  {
   int k =0;
   ...
   ...
  }
// K is out of scope..
}

Откуда компилятор знает, что K находится вне области видимости?

Ответы [ 4 ]

6 голосов
/ 18 мая 2011

Как компилятор узнает, что [локальная переменная] находится вне области действия?

Прежде всего, давайте тщательно определим термины, которые вы используете. область действия именованного объекта - это область текста программы, в которой разрешено использовать имя объекта без дополнительной квалификации имени .

Область действия локальной переменной определяется спецификацией как область текста программы, представляющая собой весь блок , который немедленно содержит объявление.

Компилятор определяет область действия локальной переменной, отслеживая пространство локального объявления , связанное с каждым синтаксическим блоком .Когда нам нужно разрешить имя, мы выясняем, в каком блоке используется имя, и просматриваем соответствующее пространство объявлений.Конечно, блоки вложены, как и пространства объявления локальных переменных, поэтому нам, возможно, придется обратиться к нескольким, по порядку, изнутри наружу.

Фактические структуры данных, которые мы используем, - это простые хеш-таблицы, оптимизированные длябыстрый поиск и фильтрация различных аспектов, необходимых компилятору.(Например, нам иногда нужно искать имена, но мы хотим получать только типы или только методы и т. Д.)

Это отвечает на ваш вопрос?Это довольно неясный вопрос.

4 голосов
/ 18 мая 2011

Поскольку компилятор обрабатывает код, он сохраняет информацию о каждом идентификаторе, с которым он сталкивается, и о каждой области действия, с которой он сталкивается, и поддерживает границы для последнего.Он знает, что K был объявлен в области видимости while, и после его окончания он, вероятно, помечает переменную как «больше не в области», поэтому любое использование помечается как ошибка.

1 голос
/ 18 мая 2011

Я бы сказал, что это бессмысленный вопрос.K выходит за рамки видимости, потому что вы написали программу таким образом: вся функция компилятора предназначена для распознавания и перевода языка программирования, включая его лексическую область видимости.

1 голос
/ 18 мая 2011

k находится вне области видимости, потому что блок, в котором он был определен, закрыт.

...