Умовні конструкції if...else у мові C

Про те, як програми приймають рішення

Будь яка програма - це послідовність команд, які комп'ютер послідовно виконує - одна за одною. А що якщо нам деякий набір команд потрібно виконувати лише при певних умовах? Або ж при певних умовах НЕ виконувати? Наприклад, якщо користувач позначений як адмін потрібно виводити якусь додаткову інформацію, корисну саме для адміністратора. При цьому звичайний користувач системи/програми не має бачити цю інформацію. Для подібних випадків в мові C передбачені умовні оператори.

Умовний оператор if

Завдяки оператору if блок коду може виконуватись лише коли результат вказаного виразу не рівен нулю. Виглядає це приблизно так:

if(вираз)
{
    //блок коду
}

Після слова if в дужках записується порівняльний або логічний вираз, потім в фігурних дужках записується блок коду, який виконується ТІЛЬКИ якщо результат виразу-умови не рівен нулю.

Зверніть увагу, що if записується малими літерами. Використання великих літер (If або IF) призведе до помилки.

У наведеному нижче прикладі ми порівнюємо два значення, щоб перевірити, чи число 20 більше за 18. В даному випадку умова є істинною, тому буде виведено повідомлення:

if(20 > 18)
{
    printf("Цей блок коду виконується!");
}

Тут вираз "20 > 18" поверне 1(ІСТИНА) як результат, тому код огорнутий фігурними дужками буде виконуватись. Детальніше про порівняння значень і логічні операції можна почитати тут.

Частіше за все в реальних програмах порівнюються значення змінних:

int a = 10;
int b = 11;

if(a != b)
{
    printf("Значення змінних a і b відрізняються!");
}

Оператор else

Цей оператор використовується щоб визначити блок коду, який буде виконано, якщо умова оператора if є хибною (рівна 0). Код з оператором else приблизно виглядає так:

if(умова)
{
    // цей блок коду виконається якщо вказана умова ІСТИННА
}
else
{
    // цей блок коду виконається якщо умова ХИБНА
}

Наприклад:

#pragma warning(disable : 4996)
#include <stdio.h>

int main() {
    system("chcp 65001 > nul");

    printf("ВІТАЄМО НА БОРТУ КОСМІЧНОГО КОРАБЛЯ 'КОТИК-ОДИН'!\n");
    printf("Будь-ласка, введіть код доступу: ");

    int code;
    scanf("%d", &code);

    if (code == 1234)
    {
        printf("Вітаємо на борту корабля, капітан!\n");
        // далі виконується яякась дуууже корисна логіка
    }
    else
    {
      printf("Невірний код доступу! Доступ заборонено!\n");
    }

    return 0;
}

В коді вище після привітання система запитує код доступу у користувача. Якщо введений код дорівнює 1234, то умова code == 1234 поверне значення 1 в якості результату і блок оператора if виконається. Інакше виконається код блока else. Таким чином програма при виконанні буде мати різні результати виконання в залежності від даних користувача:

Інструкція else if

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

За допомогою else if можна послідовно перевіряти кілька умов одну за одною. Синтаксис:

if (умова1) {
    // блок коду, який виконується, якщо умова1 істинна
} else if (умова2) {
    // блок коду, який виконується, якщо умова1 хибна,
    // а умова2 істинна
} else {
    // блок коду, який виконується,
    // якщо обидві умови хибні
}

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

У наведеному нижче прикладі ми визначаємо, яке повідомлення потрібно вивести, залежно від значення змінної time:

int time = 16;

if (time < 12) {
    printf("Доброго ранку.");
} else if (time < 18) {
    printf("Добрий день.");
} else {
    printf("Добрий вечір.");
}

Змінна time має значення 16. Перша умова (time < 12) є хибною, але друга умова (time < 18) — істинна. Тому виконується код усередині блоку else if, і на екран виводиться повідомлення "Добрий день.".

Якби значення змінної time дорівнювало 22, жодна з умов не була б істинною. У такому випадку виконалася б гілка else, і програма вивела б повідомлення "Добрий вечір.".

Вкладений оператор if

Іноді виникає потреба перевірити одну умову лише після того, як інша вже виявилася істинною. Для цього використовується вкладений оператор if (nested if).

Вкладений if — це звичайний оператор if, розташований усередині іншого оператора if. Внутрішня перевірка виконується тільки тоді, коли зовнішня умова є істинною. Синтаксис:

if (умова1) {
    // Код виконується, якщо умова1 істинна

    if (умова2) {
        // Код виконується, якщо істинні
        // і умова1, і умова2
    }
}

У наведеному нижче прикладі спочатку перевіряється, чи значення змінної x більше за 10. Якщо ця умова виконується, програма переходить до другої перевірки — чи значення змінної y більше за 20.

#pragma warning(disable : 4996)
#include <stdio.h>

int main() {
    system("chcp 65001 > nul");

    int x = 15;
    int y = 25;

    if (x > 10)
    {
        printf("x більше за 10\n");

        // Вкладений оператор if
        if (y > 20)
        {
            printf("y також більше за 20\n");
        }
    }

    return 0;
}

Результатом буде:
x більше за 10
y також більше за 20

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

Перевіряється умова x > 10.
Оскільки 15 > 10, виконується код зовнішнього оператора if.
Усередині нього перевіряється друга умова y > 20.
Оскільки 25 > 20, виконується код вкладеного оператора if.
На екран виводяться обидва повідомлення.

Якби значення x було меншим або дорівнювало 10, внутрішній оператор if навіть не перевірявся б, оскільки виконання не зайшло б до тіла зовнішнього оператора if.

Порада: не варто створювати занадто глибокі вкладення if, оскільки це ускладнює читання коду. Якщо вкладених перевірок стає багато, часто краще використати логічні оператори (&&, ||) або переглянути структуру програми.

Логічні оператори в умовах

Під час створення умов часто виникає потреба перевірити не одну, а відразу кілька умов. Для цього використовуються логічні оператори. Вони дозволяють поєднувати умови або змінювати результат їх перевірки. Логічні оператори найчастіше застосовуються разом з операторами if, else if та while.

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

Перевіримо, чи значення змінної a більше за b, і одночасно чи значення c більше за a.

#pragma warning(disable : 4996)
#include <stdio.h>

int main() {
    system("chcp 65001 > nul");

    int a = 200;
    int b = 33;
    int c = 500;

    if (a > b && c > a)
    {
        printf("Обидві умови істинні\n");
    }

    return 0;
}

Спочатку обчислюється умова a > b, потім — c > a. Лише якщо обидві умови істинні, виконується тіло оператора if.

Оператор || використовується тоді, коли достатньо, щоб істинною була хоча б одна умова. Якщо всі умови є хибними, тіло оператора if не виконується.

Перевіримо, чи значення a більше за b, або чи значення a більше за c.

#pragma warning(disable : 4996)
#include <stdio.h>

int main() {
    system("chcp 65001 > nul");

    int a = 200;
    int b = 33;
    int c = 500;

    if (a > b || a > c)
    {
        printf("Принаймні одна умова істинна\n");
    }

    return 0;
}

У цьому прикладі умова a > b є істинною, тому весь логічний вираз також є істинним, навіть незважаючи на те, що умова a > c є хибною.

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

Перевіримо, що значення змінної a не більше за значення змінної b.

#pragma warning(disable : 4996)
#include <stdio.h>

int main() {
    system("chcp 65001 > nul");

    int a = 33;
    int b = 200;

    if (!(a > b))
    {
        printf("a НЕ більше за b\n");
    }

    return 0;
}

Спочатку обчислюється вираз: a > b. У нашому прикладі він має значення false, оскільки 33 менше за 200. Після застосування оператора ! результат змінюється на true, тому код усередині if виконується.

Логічні оператори можна поєднувати між собою, створюючи складні умови. Наприклад:

if ((age >= 18 && age <= 65) || isStudent)
{
    // ...
}

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


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


Ця стаття з циклу статей Уроки програмування на мові C.

Наступний урок в процесі написання...

Just decoration