Главная chevron_right Структура chevron_right Управляющие конструкции chevron_right switch...case

switch...case

switch...case выбирает блок кода по значению переменной — удобная альтернатива длинной цепочке if...else if, особенно при обработке команд или состояний.

Полная статья

Описание

Как и if, switch...case управляет ходом выполнения программы: в зависимости от значения переменной выполняется тот или иной блок кода. Принцип работы прост — оператор последовательно сравнивает значение переменной с константами в каждом case и, найдя совпадение, начинает выполнять код этой ветки.

Это особенно удобно, когда нужно обработать несколько фиксированных значений: например, команды, поступающие по Serial, коды кнопок или состояния конечного автомата. Цепочка if...else if...else if в таких случаях читается хуже и сложнее поддерживается.

Ключевое слово break завершает выполнение текущей ветки и передаёт управление за пределы switch. Если break не написать, выполнение «провалится» в следующий case — код продолжит работать дальше независимо от того, совпадает ли следующая метка с переменной. Иногда это используют намеренно, но чаще это ошибка, поэтому всегда проверяйте наличие break в конце каждого блока.

Синтаксис

    switch (var) {
      case label1:
        // операторы
        break;
      case label2:
        // операторы
        break;
      default:
        // операторы
        break;
    }

Параметры

var: целочисленная переменная, значение которой сравнивается с метками case. Подходит любой целочисленный тип данных: byte, char, int, long.

label1, label2: целочисленные константы, с которыми сравнивается переменная. Тип должен быть совместим с типом переменной.

Тип данных bool тоже допустим, если в операторе используется ровно два варианта case.

В качестве значений можно использовать отрицательные числа — это корректно и иногда полезно при работе с кодами ошибок или направлениями движения.

Возвращает

Ничего

Пример кода

    switch (var) {
      case 1:
        // выполняется, когда var равно 1
        break;
      case 2:
        // выполняется, когда var равно 2
        break;
      default:
        // если ничего не совпало, выполняется default
        // default необязателен
        break;
    }

Где применяется

  • Обработка команд по Serial — каждый символ или число соответствует определённому действию.
  • Конечные автоматы — переменная хранит текущее состояние устройства, а switch...case выбирает нужное поведение.
  • Меню на дисплее — в зависимости от номера выбранного пункта выполняется соответствующий код.
  • Реакция на нажатие кнопок — если кнопок несколько и каждой соответствует своё действие.

Практические замечания

  • Всегда завершайте каждый case оператором break, если не планируете намеренный «провал» в следующую ветку.
  • Добавляйте ветку default в конце — она сработает, если ни один case не совпал. Это помогает поймать неожиданные значения и упрощает отладку.
  • switch...case работает только с целыми числами и символами (char). Сравнивать числа с плавающей точкой (float, double) или строки (String) этим способом нельзя — для таких случаев используйте if.
  • Если несколько значений должны выполнять одинаковый код, можно написать их подряд без break между ними — это легальный и читаемый приём.
  • При отладке удобно добавить в ветку default вывод в Serial.println() — так сразу видно, что пришло неожиданное значение.

Полезные материалы