В компьютерном программировании автоматическая переменная — это локальная переменная , которая выделяется и освобождается автоматически, когда поток программы входит и выходит из области действия переменной. Область действия — это лексический контекст, в частности функция или блок, в котором определена переменная. Локальные данные обычно (в большинстве языков) невидимы вне функции или лексического контекста, в котором они определены. Локальные данные также невидимы и недоступны для вызываемой функции [примечание 1] , но не освобождаются, возвращаясь в область видимости, когда поток выполнения возвращается к вызывающей стороне.
Автоматические локальные переменные в первую очередь применяются к рекурсивным языкам с лексической областью действия . [примечание 2] Автоматические локальные переменные обычно выделяются в кадре стека процедуры, в которой они объявлены. [примечание 3] Первоначально это было сделано для достижения повторного входа и разрешения рекурсии , [примечание 4] — это соображение, которое применяется и сегодня. Концепция автоматических переменных в рекурсивных (и вложенных ) функциях в языке с лексической областью была представлена широкой аудитории вместе с АЛГОЛом в конце 1950-х годов и далее популяризирована его многочисленными потомками.
Термин «локальная переменная» обычно является синонимом автоматической переменной, поскольку во многих языках программирования это одно и то же, но «локальная» имеет более общий характер: большинство локальных переменных являются автоматическими локальными переменными, но существуют также статические локальные переменные , особенно в C. локальная переменная, выделение статическое (время жизни — это все выполнение программы), а не автоматическое, но только в области видимости во время выполнения функции.
(Называемые автоматическими переменными.)
Все переменные, объявленные внутри блока кода, по умолчанию являются автоматическими. Неинициализированная автоматическая переменная имеет неопределенное значение до тех пор, пока ей не будет присвоено допустимое значение ее типа. [1] Спецификатор класса хранения auto
также можно добавить к этим объявлениям переменных, но, поскольку все они по умолчанию выполняются автоматически, это совершенно избыточно и делается редко.
В C использование класса хранения register
является подсказкой компилятору кэшировать переменную в регистре процессора. Помимо запрета использования оператора адреса ( &
) для переменной или любого из ее подкомпонентов, компилятор может игнорировать подсказку. [2]
В C++ конструктор автоматических переменных вызывается, когда выполнение достигает места объявления. Деструктор вызывается по достижении конца данного программного блока (программные блоки заключаются в фигурные скобки). Эта функция часто используется для управления выделением и освобождением ресурсов, например, для открытия, а затем автоматического закрытия файлов или освобождения памяти. См. раздел «Инициализация сбора ресурсов» (RAII).
Начиная с C++11, C++ позволяет объявлять переменные с помощью auto
спецификатора типа [3] , но это означает, что тип переменной выводится и не относится к области видимости переменной.
(Называемые локальными переменными .)
Похож на C и C++, но здесь нет ключевого слова auto
or register
. Однако компилятор Java не позволит использовать неявно инициализированную локальную переменную и выдаст ошибку компиляции (в отличие от C и C++, где компилятор обычно выдает только предупреждение). Стандарт Java требует, чтобы каждая локальная переменная была явно инициализирована перед использованием. [4] Это отличается от переменных экземпляра, которые неявно инициализируются значениями по умолчанию (которые0для чисел инулевойдля объектов).
(Называемые лексическими , my или частными переменными.)
В Perl локальные переменные объявляются с помощью my
оператора. Неинициализированные скаляры будут иметь значение undef
; неинициализированные массивы или хэши будут ()
. [5]
В Perl также есть local
оператор, который не создает автоматические переменные, [6] вместо этого присваивает глобальным (пакетным) переменным временное значение, которое динамически ограничивается охватывающим блоком. Когда область действия переменной выходит из области действия, старое значение восстанавливается.