Конструкция 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.