Автоматическая переменная (Gfmkbgmncyvtgx hyjybyuugx)
В компьютерном программировании автоматическая переменная — локальная переменная, которая выделяется и освобождается автоматически, когда поток выполнения программы входит и выходит из области действия переменной. Область действия — это лексический контекст, в частности, функция или блок, в котором определена переменная. Локальные данные обычно (в большинстве языков) невидимы вне функции или лексического контекста, в котором они определены. Локальные данные также невидимы и недоступны для вызываемой функции[note 1], но не освобождаются, возвращаясь в область видимости, когда поток выполнения возвращается к вызывающей стороне.
Понятие автоматических локальных переменных в первую очередь применяется в рекурсивных языках с лексической областью видимости[note 2]. Автоматические локальные переменные обычно размещаются в стековом кадре процедуры, в которой они объявлены[note 3]. Первоначально это было сделано для достижения повторного входа и разрешения рекурсии[note 4], — соображение, которое актуально и сегодня. Концепция автоматических переменных в рекурсивных (и вложенных) функциях в языке с лексической областью видимости была представлена широкой аудитории вместе с ALGOL в конце 1950-х годов и получила дальнейшее распространение благодаря его многочисленным потомкам.
Термин локальная переменная обычно является синонимом автоматической переменной, поскольку во многих языках программирования это одно и то же, но локальная переменная является более общей — большинство локальных переменных являются автоматическими локальными переменными, но также существуют статические локальные переменные, особенно в C. Для статической локальной переменной, выделение области памяти является статическим (время жизни — все время выполнения программы), не автоматическим, но она находится в области видимости только во время выполнения функции.
В конкретных языках программирования
[править | править код]C, C++
[править | править код]Все переменные, объявленные в блоке кода, по умолчанию являются автоматическими. Неинициализированная автоматическая переменная имеет неопределенное значение до тех пор, пока ей не будет присвоено допустимое значение ее типа.[1] Cпецификатор auto
может быть добавлен к объявлениям этих переменных, но, поскольку по умолчанию все они автоматические, это совершенно избыточно и делается редко.
В C использование ключевого слова register
является подсказкой компилятору, о необходимости кэширования переменной в регистре процессора. Помимо запрещения использования оператора адреса (&
) для переменной или любого из ее подкомпонентов, компилятор может игнорировать данную подсказку.[2]
В C++ конструктор автоматических переменных вызывается, когда выполнение достигает места объявления. Деструктор вызывается, когда он достигает конца заданного блока программы (блоки программы заключены в фигурные скобки). Эта функция часто используется для управления выделением и освобождением ресурсов, например для открытия и автоматического закрытия файлов или освобождения памяти. См. раздел «Инициализация ресурсов — это инициализация (RAII)».
Начиная с C++11, C++ позволяет объявлять переменные с ключевым словом auto
[3], но это означает, что тип переменной выводится и не относится к области действия переменной.
Java
[править | править код]Автоматические переменные называются локальными переменными.
Подобно C и C++, но здесь нет ключевого слова auto
или register
. Однако компилятор Java не позволит использовать локальную переменную, явно не инициализированную и выдаст ошибку компиляции (в отличие от C и C++, где компилятор обычно выдает только предупреждение). Стандарт языка Java требует, чтобы инициализацию каждой локальной переменной перед её использованием.[4] Это отличается от переменных объектов, которые неявно инициализируются значениями по умолчанию (которые равны 0
для чисел и null
для объектов).
Perl
[править | править код](Автоматические переменные называются лексическими, моими (my) или частными (private) переменными.)
В Perl локальные переменные объявляются с помощью оператора my
. Неинициализированные скалярные переменные будут иметь значение undef
; неинициализированные массивы или хэши будут иметь значение ()
.[5]
В Perl также есть оператор local
, который не создает автоматических переменных [6], вместо этого присваивая глобальным (пакетным) переменным временное значение, которое динамически привязано к окружающему блоку. При выходе из области действия переменной старое значение восстанавливается.
См. также
[править | править код]- Массив переменной длины (новая функция C99)
- Стек вызовов
Заметки
[править | править код]- ↑ если это не вложенная функция, которая определена вместе локальными данными
- ↑ хотя они существуют в похожей, но не идентичной форме также и в рекурсивных языках с динамической областью видимости, таких как старые варианты языка LISP
- ↑ , если не указано иное, к примеру, статические данные или данные кучи , которые указываются в некоторых языках
- ↑ Когда используется свойство реентерабельности подпрограммы, для рекурсии или иным образом, оптимизатор не должен пытаться размещать такие переменные в регистрах процессора (для эффективности), поскольку это нарушило бы реентерабельность.
Ссылки
[править | править код]- ↑ на 2008 год C standard . Дата обращения: 30 августа 2022. Архивировано 11 января 2018 года. (3.61 MiB): section 6.2.4, Storage durations of objects
- ↑ Storage Duration, Архивировано 9 октября 2022, Дата обращения: 30 августа 2022
- ↑ Placeholder type specifiers, Архивировано 20 октября 2016, Дата обращения: 30 августа 2022
- ↑ 4.12.5 Initial Values of Variables . Sun Microsystems. Дата обращения: 17 октября 2008. Архивировано 5 сентября 2012 года.
- ↑ Private variables via my() - perlsub - perldoc.perl.org . Дата обращения: 17 октября 2008. Архивировано 21 сентября 2020 года.
- ↑ Temporary values via local() - perlsub - perldoc.perl.org . Дата обращения: 25 февраля 2011. Архивировано 21 сентября 2020 года.