Урок №31. Ініціалізація, присвоювання і оголошення змінних

  Юрій  | 

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

 94

Цей урок є більш детальним продовженням уроку №13.

Адреси і змінні

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

Найменша одиниця пам’яті — біт (англ. “bit” від “binary digit“), який може містити значення 0 або 1. Ви можете думати про біт, як про перемикач світла — або світло вимкнене (0), або ввімкнене (1). Чогось середнього між ними немає. Якщо переглянути випадковий шматочок пам’яті, то все, що ви побачите, буде ...011010100101010... або щось в цьому роді. Пам’ять організована в послідовні частини — адреси. Подібно до того, як ми використовуємо адреси в реальному житті, щоб знайти певний будинок на вулиці, так і тут: адреси дозволяють знайти і отримати доступ до вмісту, який знаходиться в певному місці в пам’яті. Можливо, це здивує вас, але в сучасних комп’ютерах, у кожного біта окремо немає своєї власної адреси. Найменшою одиницею, яка має адрес, є байт (англ. “byte“, який складається з 8 бітів).

Оскільки всі дані комп’ютера — це лише послідовність бітів, то ми використовуємо тип даних (або просто “тип“), щоб повідомити компілятору, як інтерпретувати вміст пам’яті. Ви вже бачили приклад типу даних: int (цілочисельний тип даних). Коли ми оголошуємо цілочисельну змінну, то ми повідомляємо компілятору, що “шматочок пам’яті, який знаходиться за такою-то адресою, слід інтерпретувати як ціле число”.

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

Крім int, є багато інших типів даних в C++, більшість з яких ми детально розглянемо в відповідних уроках.

Фундаментальні типи даних в С++

У C++ є вбудована підтримка певних типів даних. Їх називають основними типами даних (або ще “фундаментальні/базові/вбудовані типи даних“).

Ось список основних типів даних в C++:

Категорія Тип Значення Приклад
Логічний тип даних bool true або false true
Символьний тип даних char, wchar_t, char16_t, char32_t Один з ASCII-символів ‘c’
Тип даних з плаваючою крапкою float, double, long double Десятковий дріб 3.14159
Цілочисельний тип даних short, int, long, long long Ціле число 64
Пустота void Пустота

Оголошення змінних

Ви вже знаєте, як оголошувати цілочисельні змінні:

Принцип оголошення змінних інших типів аналогічний:

Оголошення 5 змінних різних типів:

Зверніть увагу, що змінної типу void тут немає (про це ми поговоримо в наступному уроці).

Ініціалізація змінних

При оголошенні змінної ми можемо присвоїти їй значення в цей же момент. Це називається ініціалізацією змінної.

C++ підтримує 2 основних способи ініціалізації змінних:

Копіююча ініціалізація (або ще “ініціалізація копіюванням”) з допомогою знаку рівності (=):

Пряма ініціалізація з допомогою круглих дужок:

Пряма ініціалізація може працювати краще з деякими типами даних, копіююча ініціалізація — з іншими типами даних.

uniform-ініціалізація

Пряма або копіююча ініціалізації працюють не з усіма типами даних (наприклад, ви не зможете використовувати ці форми для ініціалізації списку значень).

У спробі забезпечити єдиний механізм ініціалізації, який буде працювати з усіма типами даних, в C++11 додали нову форму ініціалізації, яка називається uniform-ініціалізацією:

Ініціалізація змінної з порожніми дужками вказує на ініціалізацію за замовчуванням (змінній присвоюється 0):

У uniform-ініціалізації є ще одна додаткова перевага: ви не можете присвоювати змінній значення, яке не підтримує її тип даних — компілятор видасть попередження або повідомлення про помилку, наприклад:

Правило: Використовуйте uniform-ініціалізацію.

Присвоювання значень

Коли змінній присвоюється значення після її оголошення (НЕ в момент оголошення), то це копіююче присвоювання (або просто “присвоювання“):

У C++ немає вбудованої підтримки форм прямого/uniform-присвоювання, є тільки копіююче присвоювання.

Оголошення декількох змінних

В одному стейтменті можна оголосити відразу декілька змінних одного і того ж типу даних, розділяючи їх імена комами. Наприклад, наступні 2 фрагменти коду виконують одне і те ж:

та:

Крім того, ви можете, навіть, ініціалізувати декілька змінних в одному рядку:

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

Помилка №1: Вказувати кожній змінній її (один і той же) тип даних. Це не настільки жахлива помилка, так як компілятор легко її виявить і повідомить вам про це:

Помилка №2: Використання різних типів даних в одному стейтменті. Змінні різних типів повинні бути оголошені в різних стейтментах. Цю помилку компілятор також легко знайде:

Помилка №3: Ініціалізація двох змінних однією операцією:

Хороший спосіб запам’ятати цю помилку — використовувати пряму або uniform-ініціалізацію:

Так зрозуміліше, що значення 5 присвоюється тільки змінним b і d.

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

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

Де оголошувати змінні?

Більш старі версії компіляторів мови Сі змушували користувачів оголошувати всі змінні у верхній частині функції:

Зараз це вже не обов’язково. Сучасні компілятори не вимагають, щоб всі змінні обов’язково були оголошені в самому верху функції. В С++ пріоритетним є оголошення змінних якомога ближче до їх першого використання:

Такий стиль написання коду має декілька переваг.

По-перше, біля змінних, які оголошені якомога ближче до їх першого використання, знаходиться інший код, який сприяє кращому розумінню того, що відбувається. Якби змінна х була оголошена в самому верху функції main(), то ми б не мали ні найменшого уявлення, для чого вона використовується, поки б не переглянули всю функцію цілком і не побачили б, де ж вона фактично використовується. Оголошення змінної х біля операцій вводу/виводу даних дозволяє нам зрозуміти, що ця змінна використовується для вводу/виводу даних.

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

І, нарешті, зменшується ймовірність випадкового створення неініціалізованих змінних.

У більшості випадків, ви можете оголосити змінну безпосередньо в рядку перед її першим використанням. Проте, іноді, можуть бути випадки, коли це не є бажаним (з міркувань продуктивності) або неможливо. Детальніше про це ми поговоримо в наступних уроках.

Правило: Оголошуйте змінні якомога ближче до їх першого використання.

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

1 Зірка2 Зірки3 Зірки4 Зірки5 Зірок (Немає Оцінок)
Loading...

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

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