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

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

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

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

В конкретных языках программирования

C, C++ 
Все переменные, объявленные в блоке кода, по умолчанию являются автоматическими. Неинициализированная автоматическая переменная имеет неопределенное значение до тех пор, пока ей не будет присвоено допустимое значение ее типа. Cпецификатор auto может быть добавлен к объявлениям этих переменных, но, поскольку по умолчанию все они автоматические, это совершенно избыточно и делается редко.

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

В C++ конструктор автоматических переменных вызывается, когда выполнение достигает места объявления. Деструктор вызывается, когда он достигает конца заданного блока программы (блоки программы заключены в фигурные скобки). Эта функция часто используется для управления выделением и освобождением ресурсов, например для открытия и автоматического закрытия файлов или освобождения памяти. См. раздел «Инициализация ресурсов — это инициализация (RAII)».

Начиная с C++11, C++ позволяет объявлять переменные с ключевым словом auto, но это означает, что тип переменной выводится и не относится к области действия переменной.

Java 
(Автоматические переменные называются локальными переменными)

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

Perl 
(Автоматические переменные называются лексическими, моими (my) или частными (private) переменными.)

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

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

См. также 

 Массив переменной длины (новая функция C99)
 Стек вызовов

Заметки

Ссылки 

Переменная (программирование)
Управление памятью