1. Отсутствие автоматического выхода (fall-through): В C++ после выполнения блока case управление переходит к следующему блоку, если явно не указан оператор break. Это называется “провал” (fall-through). Если не использовать break, все последующие блоки будут выполнены до конца или до встречи с break.

    int value = 2;
     
    switch (value) {
        case 1:
            cout << "Case 1" << endl;
            // Пропуск break означает, что выполнение пойдет дальше в case 2
        case 2:
            cout << "Case 2" << endl;
            // Выполнится, даже если value равно 1
            break;
        case 3:
            cout << "Case 3" << endl;
            break;
        default:
            cout << "Default case" << endl;
    }
     
    // Вывод:
    // Case 2
  2. Использование оператора break: Оператор break завершает выполнение блока case и передает управление за пределы конструкции switch. Без break все последующие блоки будут выполнены до встречи с break или до конца switch.

    int value = 1;
     
    switch (value) {
        case 1:
            cout << "Case 1" << endl;
            break; // завершает выполнение блока case 1
        case 2:
            cout << "Case 2" << endl;
            break;
        default:
            cout << "Default case" << endl;
    }
     
    // Вывод:
    // Case 1
  3. Блок default: Блок default выполняется, если ни один из блоков case не соответствует значению выражения. Он не обязателен, но полезен для обработки неожиданных значений.

    int value = 5;
     
    switch (value) {
        case 1:
            cout << "Case 1" << endl;
            break;
        case 2:
            cout << "Case 2" << endl;
            break;
        default:
            cout << "Default case" << endl;
    }
     
    // Вывод:
    // Default case
  4. Группировка блоков case: Можно группировать несколько значений case, если они требуют выполнения одного и того же кода. Для этого просто не указывают break до последнего блока в группе.

    int value = 1;
     
    switch (value) {
        case 1:
        case 2:
        case 3:
            cout << "Case 1, 2, or 3" << endl;
            break;
        default:
            cout << "Default case" << endl;
    }
     
    // Вывод:
    // Case 1, 2, or 3
  5. Объявление переменных в блоках case: В C++ объявления переменных внутри блоков case требуют особого внимания. Из-за отсутствия автоматической изоляции блоков возникает необходимость использовать дополнительные фигурные скобки для ограничения области видимости переменной.

    int value = 1;
     
    switch (value) {
        case 1: {
            int x = 10; // объявление переменной в блоке case 1
            cout << "Case 1, x = " << x << endl;
            break;
        }
        case 2:
            int y = 20; // ошибка: перескочит декларацию переменной
            cout << "Case 2, y = " << y << endl;
            break;
        default:
            cout << "Default case" << endl;
    }
     
    // Вывод:
    // Case 1, x = 10
  6. Диапазоны и сложные условия в case: В стандарте C++ не поддерживаются диапазоны и сложные условия в блоках case. Для таких случаев необходимо использовать вложенные конструкции if.

    int value = 10;
     
    switch (value) {
        case 1 ... 5: // это вызовет синтаксическую ошибку
            cout << "Value between 1 and 5" << endl;
            break;
        default:
            if (value >= 6 && value <= 10) {
                cout << "Value between 6 and 10" << endl;
            } else {
                cout << "Value outside range" << endl;
            }
    }
     
    // Вывод:
    // Value between 6 and 10