stringtranslate.com

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

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

Автоматические локальные переменные в первую очередь применяются к рекурсивным языкам с лексической областью действия . [примечание 2] Автоматические локальные переменные обычно выделяются в кадре стека процедуры, в которой они объявлены. [примечание 3] Первоначально это было сделано для достижения повторного входа и разрешения рекурсии , [примечание 4] — это соображение, которое применяется и сегодня. Концепция автоматических переменных в рекурсивных (и вложенных ) функциях в языке с лексической областью была представлена ​​широкой аудитории вместе с АЛГОЛом в конце 1950-х годов и далее популяризирована его многочисленными потомками.

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

На определенных языках программирования

С, С++

(Называемые автоматическими переменными.)

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

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

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

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

Джава

(Называемые локальными переменными .)

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

Перл

(Называемые лексическими , my или частными переменными.)

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

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

Смотрите также

Примечания

  1. ^ если это не вложенная функция , которая сама определена в этих локальных данных
  2. ^ хотя они существуют в несколько похожей, но не идентичной форме также в рекурсивных языках с динамической областью видимости , таких как старые варианты LISP
  3. ^, если не указано иное, например статические данные или данные в куче, которые можно указать в некоторых языках.
  4. ^ Когда свойство реентерабельности подпрограммы используется для рекурсии или иным образом, оптимизатор не должен пытаться разместить такие переменные в регистрах процессора (для эффективности), поскольку это нарушит реентерабельность.

Рекомендации

  1. ^ Текущий «стандарт C» (PDF) .  (3,61  МБ ) : раздел 6.2.4, Продолжительность хранения объектов
  2. ^ «Продолжительность хранения», cppreference.com
  3. ^ «Спецификаторы типа заполнителя», cppreference.com
  4. ^ «4.12.5 Начальные значения переменных». Сан Микросистемс . Проверено 17 октября 2008 г.
  5. ^ "Частные переменные через my() - perlsub - perldoc.perl.org" . Проверено 17 октября 2008 г.
  6. ^ «Временные значения через local() — perlsub — perldoc.perl.org» . Проверено 25 февраля 2011 г.