Конструкция switch-case

Последнее обновление: 20.02.2023

Конструкция 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, возможно, встречается нечасто. Однако может вызвать затруднения. Так, если переменная определяется в блоке 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 с инициализацией переменной

Иногда в конструкции 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.

Помощь сайту
Юмани:
410011174743222
Перевод на карту
Номер карты:
4048415020898850