Урок №67. Оператори умовного розгалуження if/else

  Юрій  | 

  Оновл. 18 Чер 2020  | 

 290

У цьому уроці ми розглянемо оператори умовного розгалуження if/else та їх ефективне використання.

Умовні розгалуження if/else

Найпростішими умовними розгалуженнями в С++ є стейтменти if/else. Вони виглядають наступним чином:

if (вираз)
    стейтмент1

Або ось так:

if (вираз)
    стейтмент1
else

    стейтмент2

вираз називається умовою (або ще “умовним виразом”). Якщо результатом виразу є true (будь-яке ненульове значення), то виконуватися буде стейтмент1. Якщо ж результатом виразу виявиться false (0), то виконуватися буде стейтмент2. Наприклад:

Використання декількох операцій в розгалуженнях if/else

Оператор if виконує тільки одну операцію, якщо вираз є true, і також лише одну операцію else, якщо вираз є false. Щоб виконати декілька операцій поспіль, використовуйте блок стейтментів:

Неявне вказування блоків

Якщо програміст не вказав дужки для блоку стейтментів if/else, то компілятор неявно зробить це замість нього. Таким чином, наступне:

if (вираз)
    стейтмент1
else

    стейтмент2

Буде виконуватися як:

if (вираз)
{

    стейтмент1
}
else
{

    стейтмент2
}

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

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

У цьому контексті стає зрозумілим, що змінна a має локальну область видимості і знищується в кінці блоку, в якому вона ініціалізована. Але поки ми дійдемо до рядка з std::cout, то змінна a вже перестане існувати.

Поєднання стейтментів if

Стейтменти if/else можна поєднувати:

Вкладені розгалуження if/else

Одні стейтменти if можуть бути вкладені в інші стейтменти if:

Зверніть увагу, що в програмі вище ми можемо спостерігати потенційну помилку двозначності оператора else. До якого if відноситься оператор else: до зовнішнього чи до внутрішнього?

Справа в тому, що оператор else завжди відноситься до останнього незакритого оператору if в блоці, в якому знаходиться сам else. Тобто, в програмі вище, else відноситься до внутрішнього if.

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

Тепер зрозуміло, що оператор else відноситься до внутрішнього оператору if. Використання дужок також дозволяє явно вказати прив’язку else до зовнішнього оператору if:

Використовуючи блоки стейтментів, ми уточнюємо, до якого if слід прикріплювати певний else. Без блоків оператор else буде прикріплюватися до найближчого незакритого оператору if.

Використання логічних операторів в розгалуженнях if/else

Також ви можете перевіряти відразу декілька умов в розгалуженнях if/else, використовуючи логічні оператори:

Основні використання розгалужень if/else

Розгалуження if/else активно використовуються для перевірки помилок. Наприклад, щоб обчислити квадратний корінь значення, параметр, який передається в функцію для обчислення, обов’язково повинен бути додатним:

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

Розгалуження if/else також зазвичай використовують для виконання простих математичних операцій. Наприклад, розглянемо функцію min(), яка повертає мінімальне з двох чисел:

Ця функція настільки проста, що її можна переписати, використовуючи умовний тернарний оператор ?:.

Нульові стейтменти

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

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

В наведеному вище прикладі ми випадково вказали крапку з комою в кінці оператора if. Ця необачність призведе до того, що код буде виконуватися наступним чином:

Попередження: Завжди перевіряйте, чи не “закрили” ви випадково оператор if крапкою з комою.

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

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

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

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