stringtranslate.com

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

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

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

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

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

С, С++

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

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

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

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

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

Ява

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

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

Перл

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

В 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 Начальные значения переменных". Sun Microsystems . Получено 2008-10-17 .
  5. ^ "Частные переменные через my() - perlsub - perldoc.perl.org" . Получено 2008-10-17 .
  6. ^ "Временные значения через local() - perlsub - perldoc.perl.org" . Получено 2011-02-25 .