Конструкция switch-case позволяет сравнить некоторое выражение с набором значений. Она имеет следующую форму:
switch(выражение)
{
case значение_1: инструкции_1;
case значение_2: инструкции_2;
...................
case значение_N: инструкции_N;
default: инструкции;
}
После ключевого слова switch в скобках идет сравниваемое выражение. Значение этого выражения последовательно сравнивается со значениями после оператора сase. И если совпадение будет найдено, то будет выполняться определенный блок сase.
Стоит отметить, что сравниваемое выражение в switch должно представлять один из целочисленных или символьных типов или перечисление (рассматриваются далее).
В конце конструкции switch может стоять блок default. Он необязателен и выполняется в том случае, если значение после switch не соответствует ни одному из операторов case. Например:
#include <iostream>
int main()
{
int x {2};
switch(x)
{
case 1:
std::cout << "x = 1" << "\n";
break;
case 2:
std::cout << "x = 2" << "\n";
break;
case 3:
std::cout << "x = 3" << "\n";
break;
default:
std::cout << "x is undefined" << "\n";
break;
}
}
Чтобы избежать выполнения последующих блоков case/default, в конце каждого блока ставится оператор break. То есть в данном случае будет выполняться оператор
case 2: std::cout << "x = 2" << "\n"; break;
После выполнения оператора break произойдет выход из конструкции switch..case, и остальные операторы case будут проигнорированы. Поэтому на консоль будет выведена следующая строка
x = 2
Стоит отметить важность использования оператора break. Если мы его не укажем в блоке case, то после этого блока выполнение перейдет к следующему блоку case. Например,
уберем из предыдущего примера все операторы break:
#include <iostream>
int main()
{
int x {2};
switch(x)
{
case 1:
std::cout << "x = 1" << "\n";
case 2:
std::cout << "x = 2" << "\n";
case 3:
std::cout << "x = 3" << "\n";
default:
std::cout << "x is undefined" << "\n";
}
}
В этом случае опять же будет выполняться оператор case 2:, так как переменная x=2. Однако так как этот блок case не завершается
оператором break, то после его завершения будет выполняться набор инструкций после case 3: даже несмотря на то, что переменная x по прежнему равна 2.
В итоге мы получим следующий консольный вывод:
x = 2 x = 3 x is undefined
Можно определять для нескольких меток case один набор инструкций:
#include <iostream>
int main()
{
int x {2};
switch(x)
{
case 1:
case 2:
std::cout << "x = 1 or 2" << "\n";
break;
case 3:
case 4:
std::cout << "x = 3 or 4" << "\n";
break;
case 5:
std::cout << "x = 5" << "\n";
break;
}
}
Здесь если x=1 или x=2, то выполняется одна и та же инструкция std::cout << "x = 1 or 2" << "\n". Аналогично для вариантов
x=3 и x=4 также определена общая инструкция.
Определение переменных в блоках case, возможно, встречается нечасто. Однако может вызвать затруднения. Так, если переменная определяется в блоке case, то все инструкции
блока помещаются в фигурные скобки (для блока default это не требуется):
#include <iostream>
int main()
{
int x {2};
switch(x)
{
case 1:
{
int a{10};
std::cout << a << std::endl;
break;
}
case 2:
{
int b{20};
std::cout << b << std::endl;
break;
}
default:
int c{30};
std::cout << c << std::endl;
}
}
Иногда в конструкции switch для различных промежуточных вычислений необходимо определить переменную. Для этой цели начиная со стандарта
C++17 язык С++ поддерживает особую форму конструкции switch:
switch(инициализация; выражение)
{
// ..........
}
Подобная форма также принимает выражение, значение которого сравнивается с константами после операторов case. Но теперь перед выражением еще может идти
определение и инициализация переменной. Например:
#include <iostream>
int main()
{
char op = '+';
int n = 10;
switch(int k{2}; op)
{
case '+':
std::cout << n + k << std::endl;
break;
case '-':
std::cout << n - k << std::endl;
break;
case '*':
std::cout << n * k << std::endl;
break;
}
}
В данном случае в конструкции switch определяется переменная k, которая доступна только в рамках этой конструкции switch. В качестве выражения
используется значение переменной op, которая представляет знак операции. И в зависимости от этого значения, выполняем определенную операцию с переменными n и k.