Автоматическая переменная - Automatic variable

В компьютерное программирование, автоматическая переменная местный Переменная который выделяется и освобождается автоматически, когда поток программы входит и выходит из области видимости переменной. В объем - лексический контекст, в частности функция или блок, в котором определена переменная. Локальные данные обычно (в большинстве языков) невидимы вне функции или лексического контекста, в котором они определены. Локальные данные также невидимы и недоступны для называется функция[примечание 1] но не освобождается, возвращаясь в область видимости как поток выполнения возвращается к звонящему.

Автоматические локальные переменные в первую очередь относятся к рекурсивный лексически ограниченный языков.[заметка 2] Автоматические локальные переменные обычно выделенный в стековом фрейме процедуры, в которой они заявлены.[заметка 3] Изначально это было сделано для достижения повторное вхождение и позволяя рекурсия,[примечание 4] соображение, которое актуально и сегодня. Концепция автоматических переменных в рекурсивных (и вложенный ) функции на языке с лексической областью видимости были представлены широкой аудитории с помощью АЛГОЛ в конце 1950-х годов и в дальнейшем популяризировался его многочисленными потомками.

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

На определенных языках программирования

C, C ++

(Называется автоматический переменные.)

Все переменные, объявленные в блокировать кода по умолчанию автоматические. Неинициализированная автоматическая переменная имеет неопределенный value до тех пор, пока ему не будет присвоено допустимое значение его типа.[1]

В C с использованием класса хранения регистр подсказка компилятору кэшировать переменную в регистре процессора. Кроме того, что оператор ссылки (&) для использования с переменной или любым из ее подкомпонентов, компилятор может игнорировать подсказку.

В C ++ конструктор автоматических переменных вызывается, когда выполнение достигает места объявления. Деструктор вызывается, когда он достигает конца данного программного блока (программные блоки заключены в фигурные скобки). Эта функция часто используется для управления распределением и освобождением ресурсов, например для открытия и последующего автоматического закрытия файлов или для освобождения памяти. Видеть Приобретение ресурсов - это инициализация (RAII). Обратите внимание: в C ++ 11 появился новый авто спецификатор[1], который отличается. В этом случае тип переменной предполагаемый.

Ява

(Называется локальные переменные.)

Похож на C и C ++, но нет авто или же регистр ключевое слово. Однако компилятор Java не разрешит использование неявно инициализированной локальной переменной и выдаст ошибку компиляции (в отличие от C и C ++, где компилятор обычно выдает только предупреждение). Стандарт Java требует, чтобы каждая локальная переменная была явно инициализирована перед использованием.[2] Это отличается от переменных экземпляра, которые неявно инициализируются значениями по умолчанию (которые 0 для чисел и ноль для объектов).

Perl

(Называется лексический, мой или же частный переменные.)

В Perl локальные переменные объявляются с использованием мой оператор. Неинициализированные скаляры будут иметь значение undef; неинициализированные массивы или хэши будут ().[3]

Perl также имеет местный оператор, не создающий автоматических переменных,[4] вместо этого присваивая глобальным (пакетным) переменным временное значение, которое динамически ограниченный к ограждающему блоку. Когда область видимости переменной покидает, старое значение восстанавливается.

Смотрите также

Примечания

  1. ^ если это не вложенная функция, что само по себе определенный по этим локальным данным
  2. ^ хотя они существуют в несколько похожей, но не идентичной форме, также в рекурсивных языках с динамическое определение, например старые варианты LISP
  3. ^ если не указано иное, например статические данные или данные на основе кучи, которые можно указать на некоторых языках
  4. ^ Когда реентерабельное свойство процедуры используется для рекурсии или иным образом, оптимизатор должен нет попробуйте разместить такие переменные в регистры процессора (для эффективности), так как это нарушит повторный вход.

Рекомендации

  1. ^ Текущий «Стандарт С» (PDF). (3.61 МиБ ): раздел 6.2.4, Срок хранения объектов
  2. ^ «4.12.5 Начальные значения переменных». Sun Microsystems. Получено 2008-10-17.
  3. ^ «Частные переменные через my () - perlsub - perldoc.perl.org». Получено 2008-10-17.
  4. ^ «Временные значения через local () - perlsub - perldoc.perl.org». Получено 2011-02-25.