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