Топ питань
Часова шкала
Чат
Перспективи
Автоматична змінна
локальна змінна, пам'ять для якої виділяється та звільняється автоматично, коли потік виконання програми входить і виходить із області вид З Вікіпедії, вільної енциклопедії
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
Див. також
- Масив змінної довжини (нова функція C99)
- Стек викликів
Коментарі
- якщо це не вкладена функція, визначена разом із локальними даними
- хоча вони існують у схожій, але не ідентичній формі також і в рекурсивних мовах із динамічною областю видимості, таких як старі варіанти мови Lisp
- …, якщо не вказано інше, наприклад, статичні дані або дані купи, які вказуються в деяких мовах
- За використання реентерабельності підпрограми, для рекурсії або в інший спосіб, оптимізатор не повинен намагатися розміщувати такі змінні в регістрах процесора (для ефективності), оскільки це порушило б реентерабельність.
Посилання
Wikiwand - on
Seamless Wikipedia browsing. On steroids.
Remove ads