Урок №13. Змінні, Ініціалізація і Присвоювання

  Юрій  | 

  Оновл. 13 Кві 2020  | 

 129

Програмуючи на мові C++, ми створюємо, опрацьовуємо і знищуємо об’єкти. Об’єкт — це частина пам’яті, яка може зберігати певне значення. В якості аналогії можна привести поштову скриньку, де ми зберігаємо інформацію і звідки її дістаємо. Всі комп’ютери мають оперативну пам’ять, яку використовують програми. При створенні об’єкта частина оперативної пам’яті виділяється для цього об’єкта. Більшість об’єктів, з якими ми будемо працювати в C++, є змінними.

Змінні

Cтейтмент a = 8; виглядає досить-таки простим: ми присвоюємо значення 8 змінній a. Але що таке a? a — це змінна, об’єкт з іменем.

В цьому уроці ми розглянемо тількі цілочисельні змінні. Ціле число — це число, яке можна записати без дробу, наприклад: -11, -2, 0, 5 чи 34.

Для створення змінної використовується стейтмент оголошення (різницю між оголошенням і визначенням змінної ми розглянемо трошки пізніше). Ось приклад оголошення цілочисельної змінної a (яка може містити тільки цілі числа):

При виконанні цієї інструкції центральним процесором частина оперативної пам’яті виділяється під цей об’єкт. Наприклад, припустимо, що для змінної a присвоюється комірка пам’яті під номером 150. Коли програма бачить змінну a в будь-якому виразі чи стейтменті, то вона розуміє, що для того, щоб отримати значення цієї змінної, потрібно заглянути в комірку пам’яті під номером 150.

Однією з найбільш поширених операцій зі змінними є операція присвоювання, наприклад:

Коли процесор виконує цю інструкцію, він читає її як “помістити значення 8 в комірку пам’яті під номером 150″.

Після цього ми можемо вивести це значення на екран за допомогою std::cout:

l-values і r-values

В C++ всі змінні є l-values. l-value (в перекладі “л-значення”, а вимовляється як “ел-валью”) — це значення, яке має свій адрес в пам’яті. Оскільки всі змінні мають адреса, то всі вони є l-values (наприклад, змінні a, b, c — всі є l-values). l від слова “left”, так як тільки значення l-value може знаходитися зліва в операціях присвоювання (в іншому випадку ми отримаємо помилку). Наприклад, стейтмент 9 = 10; спровокує помилку компіляції, так як 9 не є l-value. Число 9 не має свого адресу в пам’яті і, таким чином, ми нічого не можемо йому присвоїти (9 = 9 і тут нічого не зміниш).

Протилежністю l-value є r-value (в перекладі “р-значення”, вимовляється як «ер-валью»). r-value — це значення, яке не має постійної адреси в пам’яті. Прикладами можуть бути числа (наприклад, 7, яке обчислюється в 7) або вирази (наприклад, 3 + х, яке обчислюється в значення х плюс 3).

Ось декілька прикладів операцій присвоювання з використанням r-values:

Давайте детальніше розглянемо останню операцію присвоювання:

Тут змінна b використовується в двох різних контекстах:

   зліва b використовується як l-value (змінна з адресом в пам’яті);

   праворуч b використовується як r-value, яке генерує окреме значення (в даному випадку, 12).

При виконанні цього стейтмента, компілятор бачить наступне:

І тут вже зрозуміло, яке значення присвоюється змінній b.

Сильно турбуватися про l-values або r-values зараз не потрібно, так як ми ще повернемося до цієї теми в наступних уроках. Все, що вам потрібно зараз запам’ятати — це те, що в лівій частині операції присвоювання завжди має бути l-value (яке має свою адресу в пам’яті), а в правій частині операції присвоювання повинне бути r-value (яке генерує якесь значення) .

Ініціалізація vs. Присвоювання

В C++ є дві схожі концепції, які початківці дуже часто плутають: присвоювання і ініціалізація.

Після оголошення змінної, їй можна присвоїти значення за допомогою оператора присвоювання (знак дорівнює =):

В C++ ви можете оголосити змінну і відразу присвоїти їй значення. Це називається ініціалізацією змінної (або ще “визначенням змінної”):

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

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

Неініціалізовані змінні

На відміну від інших мов програмування, C і C ++ НЕ ініціалізують змінні певними значеннями за замовчуванням (наприклад, нулем). Тому, при створенні змінної, їй присвоюється комірка в пам’яті, в якій вже може знаходитися якесь сміття! Змінна без значення (з боку програміста або користувача) називається неініціалізованою змінною.

Використання неініціалізованих змінних може привести до помилок, наприклад:

В цьому випадку компілятор присвоює змінній a комірку в пам’яті, яка, на даний момент, є вільною (не використовується). Потім значення змінної a відправляється на виведення. Але що ми побачимо на екрані? Нічого, так як компілятор це не пропустить — виведеться помилка, що змінна a є неініціалізованою. У старіших версіях Visual Studio компілятор міг би вивести взагалі якесь ліве значення (наприклад, 7177728, тобто сміття), яке було б вмістом тієї комірки пам’яті, яку він привласнив би нашій змінній.

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

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

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

Тест

Який результат виконання наступних стейтментів?

Відповіді

Щоб переглянути відповідь, клікніть на неї мишкою.

Відповідь №1

Програма виведе 3: a – 3 = 3, що і присвоюється змінній a.

Відповідь №2

Програма виведе 3: змінній b присвоюється значення змінної a (3).

Відповідь №3

Програма виведе 6: a + b = 6. Тут не використовується операція присвоювання.

Відповідь №4

Програма виведе 3: значенням змінної a досі є 3.

Відповідь №5

Помилка, так як c є неініціалізованою змінною.

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

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

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

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