В компьютерном программировании , автоматическая переменная является локальной переменной , которая выделяется и освобождается автоматически , когда поток программы входит и выходит объем переменной. Область видимости - это лексический контекст, в частности функция или блок, в котором определена переменная. Локальные данные обычно (в большинстве языков) невидимы вне функции или лексического контекста, в котором они определены. Локальные данные также невидимы и недоступны для вызываемой функции [примечание 1], но не освобождаются, возвращаясь в область видимости, когда поток выполнения возвращается к вызывающей стороне.
Автоматические локальные переменные в первую очередь применяются к рекурсивным языкам с лексической областью видимости . [примечание 2] Автоматические локальные переменные обычно выделяются в стековом фрейме процедуры, в которой они объявлены. [примечание 3] Изначально это было сделано для достижения повторного входа и разрешения рекурсии , [примечание 4] - соображение, которое актуально и сегодня. Концепция автоматических переменных в рекурсивных (и вложенных ) функциях в языке с лексической областью видимости была представлена широкой аудитории с помощью ALGOL в конце 1950-х годов и в дальнейшем популяризировалась его многочисленными потомками.
Термин локальная переменная обычно является синонимом автоматической переменной, поскольку это одно и то же во многих языках программирования, но локальная является более общей - большинство локальных переменных являются автоматическими локальными переменными, но статические локальные переменные также существуют, особенно в C. локальной переменной, распределение статическое (время жизни - это выполнение всей программы), а не автоматическое, но оно находится в области видимости только во время выполнения функции.
На определенных языках программирования
C, C ++
(Называются автоматическими переменными.)
Все переменные, объявленные в блоке кода, по умолчанию автоматические. Неинициализированная автоматическая переменная имеет неопределенное значение до тех пор, пока ей не будет присвоено допустимое значение ее типа. [1]
В языке C использование класса хранения register
подсказывает компилятору кэшировать переменную в регистре процессора. Помимо запрета использования ссылающегося оператора ( &
) для переменной или любого из ее подкомпонентов, компилятор может игнорировать подсказку.
В C ++ конструктор автоматических переменных вызывается, когда выполнение достигает места объявления. Деструктор вызывается, когда он достигает конца данного программного блока (программные блоки заключены в фигурные скобки). Эта функция часто используется для управления выделением и освобождением ресурсов, например для открытия и последующего автоматического закрытия файлов или для освобождения памяти. См. « Приобретение ресурсов - инициализация» (RAII). Обратите внимание: в C ++ 11 появился новый auto
спецификатор [2], который отличается. В этом случае выводится тип переменной .
Ява
(Называются локальными переменными .)
Подобно C и C ++, но без ключевого слова auto
или register
. Однако компилятор Java не разрешит использование неявно инициализированной локальной переменной и выдаст ошибку компиляции (в отличие от C и C ++, где компилятор обычно выдает только предупреждение). Стандарт Java требует, чтобы каждая локальная переменная была явно инициализирована перед использованием. [3] Это отличается от переменных экземпляра, которые неявно инициализируются значениями по умолчанию (которые0 для чисел и ноль для объектов).
Perl
(Называются лексическими , моими или частными переменными.)
В Perl локальные переменные объявляются с помощью my
оператора. Неинициализированные скаляры будут иметь значение undef
; неинициализированные массивы или хэши будут ()
. [4]
Perl также имеет local
оператор, который не создает автоматические переменные [5], а вместо этого присваивает глобальным (пакетным) переменным временное значение, которое динамически ограничивается охватывающим блоком. Когда область видимости переменной остается, старое значение восстанавливается.
Смотрите также
Заметки
- ^, если это не вложенная функция , которая сама определяется по этим локальным данным.
- ^ хотя они существуют в несколько похожей, но не идентичной форме, также в рекурсивных языках с динамической областью видимости , таких как более старые варианты LISP
- ^, если не указано иное, например, статические данные или данные на основе кучи, которые можно указать на некоторых языках.
- ^ Когда свойство повторного входа подпрограммы используется для рекурсии или иным образом, оптимизатор не долженпытаться выделить такие переменные в регистрах процессора (для эффективности), так как это нарушит повторный вход.
Рекомендации
- ^ Текущий[Обновить] «Стандарт Си» (PDF) . (3.61 МиБ ) : раздел 6.2.4, Срок хранения объектов
- ^ "Спецификаторы типа заполнителя " , cppreference.com
- ^ «4.12.5 Начальные значения переменных» . Sun Microsystems . Проверено 17 октября 2008 .
- ^ «Частные переменные через my () - perlsub - perldoc.perl.org» . Проверено 17 октября 2008 .
- ^ «Временные значения через local () - perlsub - perldoc.perl.org» . Проверено 25 февраля 2011 .