Топ питань
Часова шкала
Чат
Перспективи

Автоматична змінна

локальна змінна, пам'ять для якої виділяється та звільняється автоматично, коли потік виконання програми входить і виходить із області вид З Вікіпедії, вільної енциклопедії

Remove ads

У комп'ютерному програмуванні автомати́чна змі́нна — локальна змінна, яка виділяється та звільняється автоматично, коли потік виконання програми входить і виходить із області видимості змінної. Область видимості — це лексичний контекст, зокрема, функція чи блок, у якому визначено змінну. Локальні дані зазвичай (у більшості мов) невидимі поза функцією або лексичним контекстом, у якому їх визначено. Локальні дані також невидимі і недоступні для функції, яку викликають,[note 1], але не вивільняються, повертаючись в область видимості, коли потік виконання повертається до сторони, яка викликає.

Поняття автоматичних локальних змінних насамперед застосовується у рекурсивних мовах із лексичною областю видимості[note 2]. Автоматичні локальні змінні зазвичай розміщуються в стековому кадрі процедури, в якій їх оголошено[note 3]. Спочатку це було зроблено для досягнення повторного входу та дозволу рекурсії[note 4] — міркування, яке актуальне й нині. Концепція автоматичних змінних у рекурсивних (і вкладених) функціях у мові з лексичною областю видимості, представлена широкій аудиторії разом з ALGOL наприкінці 1950-х років, набула подальшого поширення завдяки його численним нащадкам.

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

Remove ads

В конкретних мовах програмування

Узагальнити
Перспектива

C, C++

Всі змінні, оголошені в блоці коду, є автоматичними. Неініціалізована автоматична змінна має невизначене значення доти, доки їй не буде надано допустиме значення її типу.[1] До оголошень цих змінних можна додати специфікатор auto, але, оскільки за замовчуванням вони всі автоматичні, це зовсім надмірно і робиться рідко.

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

В C++ конструктор автоматичних змінних викликається, коли виконання досягає місця оголошення. Деструктор викликається, коли досягає кінця заданого блоку програми (блоки програми укладено у фігурні дужки). Ця функція часто використовується для керування виділенням та вивільненням ресурсів, наприклад, для відкриття та автоматичного закриття файлів або вивільнення пам'яті. Див. статтю «Отримання ресурсів — це ініціалізація (RAII)».

Починаючи з C++11, C++ дозволяє оголошувати змінні з ключовим словом auto,[3] але це означає, що тип змінної виводиться і не стосується дії змінної.

Java

Автоматичні змінні називають локальними змінними.

Подібно до C і C++, але тут немає ключового слова auto або register. Однак компілятор Java не дозволить використовувати локальну змінну без явної ініціалізації та видасть помилку компіляції (на відміну від C та C++, де компілятор зазвичай видає лише попередження). Стандарт мови Java вимагає ініціалізувати кожну локальну змінну перед її використанням.[4] Це відрізняється від змінних об'єктів, які неявно ініціалізуються типовими значеннями (рівними 0 для чисел і null для об'єктів).

Perl

(Автоматичні змінні називаються лексичними, моїми (my ) або приватними (private) змінними.)

У Perl локальні змінні оголошуються за допомогою оператора my. Неініціалізовані скалярні змінні матимуть значення undef; неініціалізовані масиви або геші матимуть значення ().[5]

У Perl також є оператор local, який не створює автоматичних змінних[6], натомість присвоюючи глобальним (пакетним) змінним тимчасове значення, яке динамічно прив'язане до навколишнього блоку. При виході з області дії змінної старе значення відновлюється.

Remove ads

Див. також

Коментарі

  1. якщо це не вкладена функція, визначена разом із локальними даними
  2. хоча вони існують у схожій, але не ідентичній формі також і в рекурсивних мовах із динамічною областю видимості, таких як старі варіанти мови Lisp
  3. …, якщо не вказано інше, наприклад, статичні дані або дані купи, які вказуються в деяких мовах
  4. За використання реентерабельності підпрограми, для рекурсії або в інший спосіб, оптимізатор не повинен намагатися розміщувати такі змінні в регістрах процесора (для ефективності), оскільки це порушило б реентерабельність.

Посилання

Loading related searches...

Wikiwand - on

Seamless Wikipedia browsing. On steroids.

Remove ads