Jump to content

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

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

См. также

[ редактировать ]

Примечания

[ редактировать ]
  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 г.


Arc.Ask3.Ru: конец переведенного документа.
Arc.Ask3.Ru
Номер скриншота №: 508d74403fa2f3cc26d7fd0b1aafd5fa__1719186480
URL1:https://arc.ask3.ru/arc/aa/50/fa/508d74403fa2f3cc26d7fd0b1aafd5fa.html
Заголовок, (Title) документа по адресу, URL1:
Automatic variable - Wikipedia
Данный printscreen веб страницы (снимок веб страницы, скриншот веб страницы), визуально-программная копия документа расположенного по адресу URL1 и сохраненная в файл, имеет: квалифицированную, усовершенствованную (подтверждены: метки времени, валидность сертификата), открепленную ЭЦП (приложена к данному файлу), что может быть использовано для подтверждения содержания и факта существования документа в этот момент времени. Права на данный скриншот принадлежат администрации Ask3.ru, использование в качестве доказательства только с письменного разрешения правообладателя скриншота. Администрация Ask3.ru не несет ответственности за информацию размещенную на данном скриншоте. Права на прочие зарегистрированные элементы любого права, изображенные на снимках принадлежат их владельцам. Качество перевода предоставляется как есть. Любые претензии, иски не могут быть предъявлены. Если вы не согласны с любым пунктом перечисленным выше, вы не можете использовать данный сайт и информация размещенную на нем (сайте/странице), немедленно покиньте данный сайт. В случае нарушения любого пункта перечисленного выше, штраф 55! (Пятьдесят пять факториал, Денежную единицу (имеющую самостоятельную стоимость) можете выбрать самостоятельно, выплаичвается товарами в течение 7 дней с момента нарушения.)