Мета:
Здобути навики використання середовища розробки мови C++, створити проект, що пояснює область дії і час життя змінних, здобути навички написання програм.
Короткі теоретичні відомості до роботи.
Кожна базова змінна крім атрибутів: ім’я, тип розмір, значення, може мати і інші атрибути, що задають їм область дії та час життя. Для визначення цих атрибутів в С++ є чотири специфікації класу пам’яті, що визначені ключовими словами: auto (автоматичний), register (регістровий), extern (зовнішній), static (статистичний).
Область дії змінної є область програми, де можна посилатися на її ідентифікатор. Область життя (існування) - область програми, при виконанні якої змінна існує у пам’яті комп’ютера. Ці області не завжди співпадають.
auto та register використовуються для оголошення змінних з локальним часом життя. Такі змінні створюються у блоці з фігурними дужками в момент їх оголошення й зникають при виході із блоку. Спеціфікатор auto встановлюється за замовчуванням й в явному вигляді застосовується рідко (наприклад, auto float p;). Спеціфікатор register вказує компілятору зберегти змінну у високошвидкісному регістрі, але компілятор може це проігнорувати. Автоматичний клас пам’яті - економить пам’ять, тому що локальні змінні створюються у блоку та при виході із цього блоку знищуються.
|
|
Клас пам’яті extern використовується для оголошення змінних з глобальним часом життя. Пам’ять для них виділяється у момент оголошення та зберігається до закінчення програми. Після їх оголошення на них може посилатися будь-яка функція. Спеціфікатор extern для глобальних змінних, такий як auto для локальних. Він встановлюється за замовчуванням.
Всередині блоку перевага відається місцевій локальній змінні. Наприклад, коли змінна int I оголошена глобальною, то повторне оголошення всередині блоку задає вже іншу, локальну, змінну з тим же ідентифікатором, а доступ до глобальної змінної переривається до виходу із блока. Тож правило переваги “внутрішній змінній ” перед “зовнішній” дотримується для локальних змінних, що оголошені у вкладених блоках.
Локальні змінні з атрибутом static доступні тільки у тому блоці, де вони оголошені, але зберігаються до кінця виконання програми.
У широкому сенсі функція теж є змінною, по визначенню класу extern. Оголошення функції – запис її прототипу обов’язково до першого виклику. Аргументи функції – локальні змінні для блока-функції.
При використані глобальних змінних всередині функції треба пам’ятати, що при некоректному складанню програми виклик цієї функції може змінити їх значення.
Для пояснення дії атрибута static розглянемо варіант функції ch (chance – випадок): “генератор випадкових чисел” з прототипом: double ch().
|
|
Функція повертає псевдовипадкове число в інтервалі (-1, 1). Локальна змінна mn у тілі забезпечена атрибутом пам’яті static. При першому виклику функції mn задається числом (mn =5). У процесі виконання значення mn змінюється, та отримує нове значення, яке зберігається до наступного виклику функції.
При цьому змінна mn повз функції ch недоступна. Функція записана у файлі SUBPROG\ch.cpp та оформлена як бібліотечна у списку roll.h. Розглянемо програму з багаторазовим викликом ch та результат її виконання.
/*файл SUBPROG\ch.cpp – Генератор випадкових чисел від -1 до 1*/