Введение в 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 покрывает все остальные значения.