switch…case в C (інструкція Switch в C) із прикладами

⚡ Розумний підсумок

Оператор switch у C порівнює один вираз з кількома мітками case та запускає відповідний блок, пропонуючи чистішу альтернативу довгим ланцюжкам if-else, коли програма повинна вибирати серед багатьох фіксованих цілочисельних або символьних значень.

  • 🔀 Багатостороннє розгалуження: Перемикач перевіряє один вираз і переходить до відповідної мітки регістру.
  • 🏷️ Мітки корпусів: У кожному випадку використовується унікальна константна ціла або символьна мітка, що закінчується двокрапкою.
  • Ключове слово «розрив»: Оператор break завершує випадок; без нього виконання переривається.
  • 🧩 Реєстр за замовчуванням: Додатковий блок за замовчуванням виконується, коли жодна мітка регістру не відповідає виразу.
  • 📋 Правила перемикання: Мітки справ залишаються постійними та унікальними, дозволено використовувати лише одну мітку за замовчуванням.

Оператор switch у C

Що таке оператор Switch у C?

Оператор switch у мові C перевіряє значення змінної та порівнює його з кількома випадками. Після того, як знайдено збіг, виконується блок операторів, пов'язаних з цим конкретним випадком.

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

Якщо відповідність регістру НЕ знайдено, тоді виконується оператор за замовчуванням, і керування виходить із блоку switch.

Синтаксис зміни регістру

Загальний синтаксис того, як реалізовано перемикання регістрів у програмі на C, такий:

switch( expression )
{
	case value-1:
			Block-1;
			Break;
	case value-2:
			Block-2;
			Break;
	case value-n:
			Block-n;
			Break;
	default:
			Block-1;
			Break;
}
Statement-x;
  • Вираз може бути цілим чи символьним виразом.
  • Значення-1, 2, n – це мітки регістру, які використовуються для ідентифікації кожного регістру окремо. Пам’ятайте, що мітки регістру не повинні бути однаковими, оскільки це може створити проблему під час виконання програми. Припустимо, що у нас є два випадки з однаковою міткою «1». Потім, під час виконання програми, регістр, який з’являється першим, буде виконано, навіть якщо ви хочете, щоб програма виконала другий регістр. Це створює проблеми в програмі та не забезпечує бажаного результату.
  • Мітки регістру завжди закінчуються двокрапкою ( : ). Кожен із цих випадків пов’язаний з блоком.
  • Блок — це не що інше, як кілька операторів, згрупованих для конкретного випадку.
  • Щоразу, коли перемикач виконується, значення тестового виразу порівнюється з усіма випадками, які ми визначили всередині перемикача. Припустимо, тестовий вираз містить значення 4. Це значення порівнюється з усіма випадками до випадку, мітка якого чотири знайдено в програмі. Як тільки випадок знайдено, блок операторів, пов’язаний із цим конкретним випадком, виконується, і керування переходить із комутатора.
  • Ключове слово break у кожному випадку вказує на кінець конкретного випадку. Якщо ми не поставимо перерву в кожному випадку, тоді, навіть якщо конкретний випадок буде виконано, перемикач у C продовжуватиме виконувати всі випадки, доки не буде досягнуто кінця. Цього не повинно статися; отже, ми завжди повинні вставляти ключове слово break у кожному випадку. Break припинить інцидент після його виконання, і керування вийде з перемикача.
  • Регістр за замовчуванням необов’язковий. Щоразу, коли значення тестового виразу не збігається з жодним із випадків всередині перемикача, тоді буде виконано значення за замовчуванням. В іншому випадку в перемикачі не потрібно писати default.
  • Після того, як перемикач буде виконано, керування перейде до оператора x, і виконання програми продовжиться.

Блок-схема оператора Switch

Наступна схема ілюструє, як вибирається регістр у перемиканні регістрів:

Блок-схема оператора Switch

Як працює Switch

Приклад зміни регістру в C

Наступна програма ілюструє використання перемикача:

#include <stdio.h>
    int main() {
        int num = 8;
        switch (num) {
            case 7:
                printf("Value is 7");
                break;
            case 8:
                printf("Value is 8");
                break;
            case 9:
                printf("Value is 9");
                break;
            default:
                printf("Out of range");
                break;
        }
        return 0;
    }

вихід:

Value is 8

Приклад зміни регістру в C

  1. У наведеній програмі ми ініціалізували змінна num зі значенням 8.
  2. Конструкція switch використовується для порівняння значення, що зберігається в змінній num, і виконання блоку операторів, пов’язаних із відповідним регістром.
  3. У цій програмі, оскільки значення, що зберігається в змінній num, дорівнює восьми, перемикач виконає випадок, мітка якого дорівнює 8. Після виконання випадку елемент керування вийде з перемикача, і програма завершиться з успішним результатом за допомогою друк значення на екрані виводу.

Спробуйте змінити значення змінної num і помітите зміни у виводі.

Для прикладу ми розглянемо таку програму, яка за замовчуванням:

#include <stdio.h>
int main() {
int language = 10;
  switch (language) {
  case 1:
    printf("C#\n");
    break;
  case 2:
    printf("C\n");
    break;
  case 3:
    printf("C++\n");
    break;
  default:
    printf("Other programming language\n");}}

вихід:

Other programming language

Працюючи зі змінним регістром у C, ви групуєте кілька регістрів з унікальними мітками. Вам потрібно ввести оператор break у кожному випадку, щоб розгалужуватися в кінці оператора switch.

Необов’язковий випадок за замовчуванням виконується, коли не знайдено інших збігів.

Ми розглядаємо наступний оператор switch:

#include <stdio.h>
int main() {
int number=5;
switch (number) {
  case 1:
  case 2:
  case 3:
    printf("One, Two, or Three.\n");
    break;
  case 4:
  case 5:
  case 6:
    printf("Four, Five, or Six.\n");
    break;
  default:
    printf("Greater than Six.\n");}}

вихід:

Four, Five, or Six.

Вкладений перемикач у C

In C, ми можемо мати внутрішній перемикач, вбудований у зовнішній перемикач. Крім того, константи регістру внутрішнього та зовнішнього перемикачів можуть мати спільні значення та без будь-яких конфліктів.

Розглянемо наступну програму, яка просить користувача ввести свій власний ідентифікатор. Якщо ідентифікатор дійсний, програма попросить його ввести пароль; якщо пароль правильний, програма надрукує ім'я користувача, інакше програма надрукує «Неправильний пароль»; а якщо ідентифікатора не існує, програма надрукує «Неправильний ідентифікатор».

#include <stdio.h>
int main() {
        int ID = 500;
        int password = 000;
        printf("Plese Enter Your ID:\n ");
        scanf("%d", & ID);
        switch (ID) {
            case 500:
                printf("Enter your password:\n ");
                scanf("%d", & password);
                switch (password) {
                    case 000:
                        printf("Welcome Dear Programmer\n");
                        break;
                    default:
                        printf("incorrect password");
                        break;
                }
                break;
            default:
                printf("incorrect ID");
                break;
        }
}

вихід:

Plese Enter Your ID:
 500
Enter your password:
 000
Welcome Dear Programmer

Вкладений перемикач у C

  1. У наведеній програмі ми ініціалізували дві змінні: ID та пароль.
  2. Зовнішня конструкція switch використовується для порівняння значення, введеного у змінну ID. Вона виконує блок операторів, пов'язаних зі збігом (коли ID==500).
  3. Якщо блоковий оператор виконується з узгодженим регістром, внутрішній перемикач використовується для порівняння значень, введених у змінну password, та виконання операторів, пов'язаних з узгодженим регістром (коли password==000).
  4. В іншому випадку регістр перемикачів запустить регістр за замовчуванням і надрукує відповідний текст щодо структури програми.

Для чого нам потрібен кейс Switch?

Є одна потенційна проблема з оператор if-else тобто складність програми зростає щоразу, коли збільшується кількість альтернативних шляхів. Якщо ви використовуєте кілька конструкцій if-else у програмі, програму може стати важко читати та розуміти. Іноді це може навіть заплутати розробника, який сам написав програму.

Рішенням цієї проблеми є оператор switch.

Правила оператора перемикання

Дотримуйтесь цих правил під час написання switch на C:

  • Вираз повинен завжди виконуватися до результату.
  • Мітки регістру мають бути постійними та унікальними.
  • Мітки регістру мають закінчуватися двокрапкою ( : ).
  • Ключове слово break має бути присутнім у кожному випадку.
  • Може бути лише одна мітка за замовчуванням.
  • Ми можемо вкладати кілька операторів switch.

Поширені запитання

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

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

Ні. C не може перемикатися на рядки; мітки мають бути константними цілими числами. Натомість порівнюйте текст із strcmp всередині if-else.

Стандарт C забороняє діапазони, хоча GCC дозволяє непортативне розширення case 1 … 5:, якого портативний код повинен уникати.

Ні. Реєстр за замовчуванням може бути будь-де; він виконується лише тоді, коли жодна мітка не відповідає дійсності. Останнє розміщення є просто умовністю.

Так, але тіло case слід брати у фігурні дужки; інакше оголошення після мітки може спричинити помилки компілятора.

Так. Помічники ШІ-кодування створюють чернетки блоків перемикання, додають кожен розрив та позначають випадкові пропуски. Завжди перевіряйте згенеровану логіку.

Копілот GitHub автоматично доповнює мітки випадків, вставляє оператори розриву та перетворює довгі ланцюжки if-else на перемикач з коментаря.

Підсумуйте цей пост за допомогою: