Введение в C (Си)

Теория: Switch вместо if/else

Switch

В этом уроке разберем, как заменить длинную цепочку if/else if/else на switch.

Для примера возьмем функцию charcode(), которая получает символ и возвращает код:

  • Для символа 'a' функция возвращает 0.
  • Для символа 'b' функция возвращает 1.
  • Для любого другого символа функция возвращает 3.

Вариант через if else if else

int charcode(char c)
{
  if (c == 'a')
    return 0;
  else if (c == 'b')
    return 1;
  else
    return 3;
}

Здесь важно:

  • Для сравнения используем ==, а не =.
  • Оператор = выполняет присваивание.
  • Оператор != означает "не равно".

Вариант через switch

int charcode(char c)
{
  switch (c) {
    case 'a':
      return 0;
    case 'b':
      return 1;
    default:
      return 3;
  }
}

Ключевое слово case задает отдельные варианты, а default задает ветку для всех остальных значений.

Почему важен break

В switch есть важная особенность: если не поставить break, выполнение "проваливается" в следующий case.

Пример с ошибкой:

int charcode(char c)
{
  int p;

  switch (c) {
    case 'a':
      p = 0;
    case 'b':
      p = 1;
    default:
      p = 3;
  }

  return p;
}

Если передать 'a', результатом все равно станет 3, потому что выполнятся все ветки подряд.

Правильный вариант:

int charcode(char c)
{
  int p;

  switch (c) {
    case 'a':
      p = 0;
      break;
    case 'b':
      p = 1;
      break;
    default:
      p = 3;
      break;
  }

  return p;
}

Теперь поведение корректное:

  • Для символа 'a' функция возвращает 0.
  • Для символа 'b' функция возвращает 1.
  • Для любого другого символа функция возвращает 3.

Итоги

  • Конструкция switch удобна для выбора из нескольких конкретных значений.
  • Почти в каждом case нужен break, чтобы не было fallthrough.
  • Ветка default покрывает все остальные значения.

Рекомендуемые программы

+7 800 100 22 47

бесплатно по РФ

+7 495 085 21 62

бесплатно по Москве

108813 г. Москва, вн.тер.г. поселение Московский,
г. Московский, ул. Солнечная, д. 3А, стр. 1, помещ. 20Б/3
ОГРН 1217300010476
ИНН 7325174845