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