Урок №51. Локальні змінні, область видимості та тривалість

  Юрій  | 

  Оновл. 7 Тра 2020  | 

 219

Цей матеріал є продовження уроку №18.

Область видимості і тривалість

Перш ніж ми почнемо, нам потрібно спочатку розібратися з двома термінами: область видимості і тривалість. Область видимості визначає, де можна використовувати змінну. Тривалість (або ще “час життя“) визначає, де змінна створюється і де знищується. Ці дві концепції пов’язані між собою.

Змінні, які визначені всередині блоку, називаються локальними змінними. Локальні змінні мають автоматичну тривалість: вони створюються (і ініціалізуються, якщо необхідно) в точці визначення і знищуються при виході з блоку. Локальні змінні мають локальну область видимості, тобто вони входять в область видимості з точки оголошення і виходять в самому кінці блоку, в якому визначені.

Наприклад, розглянемо наступну програму:

Оскільки x і y визначені всередині блоку, який є головною функцією, то вони обидва знищуються, коли main() завершує своє виконання.

Змінні, які визначені всередині вкладених блоків, знищуються, як тільки закінчується вкладений блок:

Такі змінні можна використовувати тільки всередині блоків, в яких вони визначені. Оскільки кожна функція має свій власний блок, то змінні з однієї функції ніяк не впливають на змінні з іншої функції:

У різних функціях можуть знаходитися змінні або параметри з однаковими іменами. Це добре, тому що не потрібно турбуватися про можливість виникнення конфліктів імен між двома незалежними функціями. У прикладі нижче в обох функціях є змінні x і y. Вони навіть не підозрюють про існування один одного:

Вкладені блоки вважаються частиною зовнішнього блоку, в якому вони визначені. Отже, змінні, які визначені в зовнішньому блоці, можуть бути видимими і всередині вкладеного блоку:

Приховування імен

Змінна всередині вкладеного блоку може мати те ж ім’я, що і змінна всередині зовнішнього блоку. Коли таке трапляється, то змінна у вкладеному (внутрішньому) блоці «приховує» зовнішню змінну. Це називається приховуванням імен:

Результат виконання програми:

10
5

Тут ми спочатку оголошуємо змінну oranges в зовнішньому блоці. Потім оголошуємо другу змінну oranges, але вже у вкладеному (внутрішньому) блоці. Коли ми присвоюємо для oranges значення 10, то воно відноситься до змінної у вкладеному блоці. Після виведення цього значення, внутрішня змінна oranges знищується, залишаючи зовнішню oranges з вихідним значенням (5), яке потім виводиться. Результат виконання програми був би той же, навіть якщо б ми назвали вкладену змінну по-іншому (наприклад, nbOranges).

Зверніть увагу, якби ми не визначили вкладену змінну oranges, то ідентифікатор oranges відносився б до зовнішньої змінної і значення 10 було б присвоєно зовнішній змінній:

Результат виконання програми:

10
10

В обох прикладах, на зовнішню змінну oranges ніяк не впливає те, що відбувається з вкладеною змінною oranges. Єдина відмінність між двома програмами — це те, до чого застосовується вираз oranges = 10.

Приховування імен — це те, чого, як правило, слід уникати, оскільки воно може бути досить заплутаним!

Правило: Уникайте використання вкладених змінних з тими ж іменами, що мають зовнішні змінні.

Область видимості змінних

Змінні повинні визначатися в максимально обмеженій області видимості. Наприклад, якщо змінна використовується тільки всередині вкладеного блоку, то вона і повинна бути визначена в ньому:

Обмежуючи область видимості, ми зменшуємо складність програми, оскільки число активних змінних зменшується. Таким чином, легше побачити, де і які змінні використовуються. Змінна, яка визначена всередині блоку, може використовуватися тільки усередині цього ж блоку (або вкладених в неї підблоків). Цим ми спрощуємо розуміння і логіку програми.

Якщо в зовнішньому блоці потрібна змінна, то її необхідно оголошувати в зовнішньому блоці:

Це один з тих рідкісних випадків, коли вам може знадобитися оголосити змінну до її першого використання.

Правило: Визначайте змінні в найбільш обмеженій області видимості.

Параметри функцій

Хоча параметри функцій не визначаються всередині основного блоку (тіла) функції, в більшості випадків вони мають локальну область видимості:

Висновки

Змінні, визначені всередині блоків, називаються локальними змінними. Вони доступні тільки всередині блоку, в якому визначені (включаючи вкладені блоки) і знищуються при завершенні цього ж блоку.

Визначайте змінні в найбільш обмеженій області видимості. Якщо змінна використовується тільки всередині вкладеного блоку, то і визначати її слід всередині цього ж вкладеного блоку.

Тест

Завдання №1

Напишіть програму, яка просить користувача ввести два цілих числа: друге повинно бути більше першого. Якщо користувач введе друге число менше першого, то використовуйте блок і тимчасову змінну, щоб поміняти місцями користувацькі числа. Потім виведіть значення цих змінних. Додайте в свій код коментарі, що пояснюють, де і яка змінна знищується.

Результат виконання програми повинен бути наступним:

Введите число: 4
Введите большее число: 2
Меняем значения местами
Меньшее число: 2
Большее число: 4

Підказка: Щоб використовувати кирилицю, додайте наступний рядок коду в самий початок функції main():

Відповідь №1

Завдання №2

У чому різниця між областю видимості і тривалістю змінної? Яку область видимості і тривалість, за замовчуванням, мають локальні змінні (і що це означає)?

Відповідь №2

Область видимості визначає, де змінна доступна для використання. Тривалість змінної визначає, коли змінна створюється і коли знищується.

Локальні змінні мають локальну область видимості, доступ до них здійснюється тільки всередині блоку, в якому вони визначені.

Локальні змінні мають автоматичну тривалість, що означає, що вони створюються в точці визначення і знищуються в кінці блоку, в якому визначені.

Оцінити статтю:

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (4 оцінок, середня: 5,00 з 5)
Loading...

Залишити відповідь

Ваш E-mail не буде опублікований. Обов'язкові поля відмічені *