Конструкция «switch»
Конструкция switch заменяет собой сразу несколько if .
Она представляет собой более наглядный способ сравнить выражение сразу с несколькими вариантами.
Синтаксис
Конструкция switch имеет один или более блок case и необязательный блок default .
Выглядит она так:
switch(x) < case 'value1': // if (x === 'value1') . [break] case 'value2': // if (x === 'value2') . [break] default: . [break] >
- Переменная x проверяется на строгое равенство первому значению value1 , затем второму value2 и так далее.
- Если соответствие установлено – switch начинает выполняться от соответствующей директивы case и далее, до ближайшего break (или до конца switch ).
- Если ни один case не совпал – выполняется (если есть) вариант default .
Пример работы
Пример использования switch (сработавший код выделен):
let a = 2 + 2; switch (a)
Здесь оператор switch последовательно сравнит a со всеми вариантами из case .
Сначала 3 , затем – так как нет совпадения – 4 . Совпадение найдено, будет выполнен этот вариант, со строки alert( ‘В точку!’ ) и далее, до ближайшего break , который прервёт выполнение.
Если break нет, то выполнение пойдёт ниже по следующим case , при этом остальные проверки игнорируются.
Пример без break :
let a = 2 + 2; switch (a)
В примере выше последовательно выполнятся три alert :
alert( 'В точку!' ); alert( 'Перебор' ); alert( "Нет таких значений" );
Любое выражение может быть аргументом для switch/case
И switch и case допускают любое выражение в качестве аргумента.
let a = "1"; let b = 0; switch (+a)
В этом примере выражение +a вычисляется в 1 , что совпадает с выражением b + 1 в case , и следовательно, код в этом блоке будет выполнен.
Группировка «case»
Несколько вариантов case , использующих один код, можно группировать.
Для примера, выполним один и тот же код для case 3 и case 5 , сгруппировав их:
let a = 3; switch (a) < case 4: alert('Правильно!'); break; case 3: // (*) группируем оба case case 5: alert('Неправильно!'); alert("Может вам посетить урок математики?"); break; default: alert('Результат выглядит странновато. Честно.'); >
Теперь оба варианта 3 и 5 выводят одно сообщение.
Возможность группировать case – это побочный эффект того, как switch/case работает без break . Здесь выполнение case 3 начинается со строки (*) и продолжается в case 5 , потому что отсутствует break .
Тип имеет значение
Нужно отметить, что проверка на равенство всегда строгая. Значения должны быть одного типа, чтобы выполнялось равенство.
Для примера, давайте рассмотрим следующий код:
let arg = prompt("Введите число?"); switch (arg)
- Для ‘0’ и ‘1’ выполнится первый alert .
- Для ‘2’ – второй alert .
- Но для 3 , результат выполнения prompt будет строка «3» , которая не соответствует строгому равенству === с числом 3 . Таким образом, мы имеем «мёртвый код» в case 3 ! Выполнится вариант default .
Задачи
Напишите «if», аналогичный «switch»
важность: 5
Напишите if..else , соответствующий следующему switch :
switch (browser)
Если совсем точно следовать работе switch , то if должен выполнять строгое сравнение ‘===’ .
Впрочем, для таких строк, подойдёт и обычное сравнение ‘==’ .
if(browser == 'Edge') < alert("You've got the Edge!"); >else if (browser == 'Chrome' || browser == 'Firefox' || browser == 'Safari' || browser == 'Opera') < alert( 'Okay we support these browsers too' ); >else
Обратите внимание: конструкция browser == ‘Chrome’ || browser == ‘Firefox’ . разбита на несколько строк для лучшей читаемости.
Но всё равно запись через switch нагляднее.
Как работает switch case
Конструкция switch-case позволяет сравнить некоторое выражение с набором значений. Она имеет следующую форму:
switch(выражение)
После ключевого слова switch в скобках идет сравниваемое выражение. Значение этого выражения последовательно сравнивается со значениями после оператора сase . И если совпадение будет найдено, то будет выполняться определенный блок сase .
Стоит отметить, что сравниваемое выражение в switch должно представлять один из целочисленных или символьных типов или перечисление (рассматриваются далее).
В конце конструкции switch может стоять блок default . Он необязателен и выполняется в том случае, если значение после switch не соответствует ни одному из операторов case. Например:
#include int main() < int x ; switch(x) < case 1: std::cout >
Чтобы избежать выполнения последующих блоков case/default, в конце каждого блока ставится оператор break . То есть в данном случае будет выполняться оператор
case 2: std::coutПосле выполнения оператора break произойдет выход из конструкции switch..case, и остальные операторы case будут проигнорированы. Поэтому на консоль будет выведена следующая строка
x = 2Стоит отметить важность использования оператора break . Если мы его не укажем в блоке case , то после этого блока выполнение перейдет к следующему блоку case. Например, уберем из предыдущего примера все операторы break:
#include int main() < int x ; switch(x) < case 1: std::cout >В этом случае опять же будет выполняться оператор case 2: , так как переменная x=2. Однако так как этот блок case не завершается оператором break, то после его завершения будет выполняться набор инструкций после case 3: даже несмотря на то, что переменная x по прежнему равна 2. В итоге мы получим следующий консольный вывод:
x = 2 x = 3 x is undefinedСовмещение условий
Можно определять для нескольких меток case один набор инструкций:
#include int main() < int x ; switch(x) < case 1: case 2: std::cout >Переменные в блоках case
Определение переменных в блоках case , возможно, встречается нечасто. Однако может вызвать затруднения. Так, если переменная определяется в блоке case, то все инструкции блока помещаются в фигурные скобки (для блока default это не требуется):
#include int main() < int x ; switch(x) < case 1: < int a; std::cout case 2: < int b; std::cout default: int c; std::cout >Блок switch с инициализацией переменной
Иногда в конструкции switch для различных промежуточных вычислений необходимо определить переменную. Для этой цели начиная со стандарта C++17 язык С++ поддерживает особую форму конструкции switch :
switch(инициализация; выражение) < // . >Подобная форма также принимает выражение, значение которого сравнивается с константами после операторов case . Но теперь перед выражением еще может идти определение и инициализация переменной. Например:
#include int main() < char op = '+'; int n = 10; switch(int k; op) < case '+': std::cout >В данном случае в конструкции switch определяется переменная k , которая доступна только в рамках этой конструкции switch . В качестве выражения используется значение переменной op , которая представляет знак операции. И в зависимости от этого значения, выполняем определенную операцию с переменными n и k.
- Глава 1. Введение в С++
- Язык программирования С++
- Первая программа на Windows. Компилятор g++
- Первая программа на Windows. Компилятор Clang
- Первая программа на Windows. Компилятор Microsoft Visual C++
- Первая программа на Linux. Компилятор g++
- Первая программа на MacOS. Компилятор Clang
- Настройка параметров компиляции
- Локализация и кириллица в консоли
- Структура программы
- Переменные
- Типы данных
- Константы
- Ввод и вывод в консоли
- using. Подключение пространств имен и определение псевдонимов
- Арифметические операции
- Статическая типизация и преобразования типов
- Поразрядные операции
- Операции присваивания
- Условные выражения
- Конструкция if-else и тернарный оператор
- Конструкция switch-case
- Циклы
- Ссылки
- Массивы
- Многомерные массивы
- Массивы символов
- Введение в строки
- Что такое указатели
- Операции с указателями
- Арифметика указателей
- Константы и указатели
- Указатели и массивы
- Определение и объявление функций
- Область видимости объектов
- Параметры функции
- Передача аргументов по значению и по ссылке
- Константные параметры
- Оператор return и возвращение результата
- Указатели в параметрах функции
- Массивы в параметрах функции
- Параметры функции main
- Возвращение указателей и ссылок
- Перегрузка функций
- Рекурсивные функции
- Рекурсия на примере быстрой сортировки
- Указатели на функции
- Указатели на функции как параметры
- Тип функции
- Указатель на функцию как возвращаемое значение
- Разделение программы на файлы
- Внешние объекты
- Динамические объекты
- Динамические массивы
- unique_ptr
- shared_ptr
- Определение классов
- Конструкторы и инициализация объектов
- Управление доступом. Инкапсуляция
- Объявление и определение функций класса
- Конструктор копирования
- Константные объекты и функции
- Ключевое слово this
- Дружественные функции и классы
- Статические члены класса
- Деструктор
- Структуры
- Перечисления
- Наследование
- Управление доступом в базовых и производных классах
- Скрытие функционала базового класса
- Множественное наследование
- Виртуальные функции и их переопределение
- Преобразование типов
- Динамическое преобразование
- Особенности динамического связывания
- Чистые виртуальные функции и абстрактные классы
- Перегрузка операторов
- Операторы преобразования типов
- Оператор индексирования
- Переопределение оператора присваивания
- Пространства имен
- Вложенные классы
- Обработка исключений
- Вложенные try-catch
- Создание своих типов исключений
- Тип exception
- Типы исключений
- Шаблоны функций
- Шаблон класса
- Специализация шаблона класса
- Наследование и шаблоны классов
- Типы контейнеров
- Вектор
- Итераторы
- Операции с векторами
- Array
- List
- Forward_list
- Deque
- Стек std::stack
- Очередь std::queue
- Очередь приоритетов std::priority_queue
- Множества
- Словарь std::map
- Span
- Определение строк
- Строки с поддержкой Unicode
- Преобразование типов и строки
- Сравнение строк
- Получение подстроки и проверка начала и конца строки
- Поиск подстроки
- Изменение строки
- Операции с символами
- Программа подсчета слов
- Тип std:string_view
- rvalue
- Конструктор перемещения
- Оператор присваивания с перемещением
- Роль noexcept при перемещении
- Объекты функций
- Лямбда-выражения
- Захват внешних значений в лямбда-выражениях
- Шаблон std::function<>
- Минимальный и максимальный элементы
- Поиск элементов
- Копирование элементов
- Удаление элементов и идиома Remove-Erase Idiom
- Сортировка
- Представления. Фильтрация
- Проекция данных
- Пропуск элементов. drop_view и drop_while_view
- Извлечение диапазона элементов. take_view и take_while_view
- Цепочки представлений
- Оператор requires
- Концепты
- Выражение requires
- Ограничения типа для auto
- Базовые типы для работы с потоками
- Файловые потоки. Открытие и закрытие
- Чтение и запись текстовых файлов
- Переопределение операторов ввода и вывода
- Математические константы и операции
- Форматирование строк и функция format
- std::optional
- Управление ресурсами. Идиома RAII
- Идиома копирования и замены
- Идиома Move-and-Swap
- Первая программа в Visual Studio
- Первая программа в Qt Creator
Помощь сайту
410011174743222
Перевод на карту
Номер карты:
4048415020898850Контакты для связи: metanit22@mail.ru
Copyright © metanit.com, 2024. Все права защищены.
Оператор switch (C)
Операторы switch и case помогают управлять сложными условными операциями и операциями ветвления. Оператор switch передает управление в оператор внутри своего тела.
Синтаксис
selection-statement :
switch ( expression ) statementlabeled-statement :
case constant-expression : statement
default : statementКомментарии
Оператор switch передает управление одному из labeled-statement в своем теле в зависимости от значения expression .
Значения expression и значение каждого constant-expression должны иметь целочисленный тип. Выражение constant-expression должно иметь однозначное константное целочисленное значение во время компиляции.
Управление передается оператору case , значение constant-expression которого соответствует значению выражения expression . Оператор switch может содержать неограниченное число экземпляров case . Однако значения ни одной из пар выражений constant-expression в одном операторе switch не должны совпадать. Выполнение тела оператора switch начинается с первого соответствующего оператора labeled-statement или после него. Выполнение продолжается до конца тела оператора или пока оператор break не передаст управление за пределы тела.
Оператор switch обычно используется следующим образом:
switch ( expression ) < // declarations // . . . case constant_expression: // statements executed if the expression equals the // value of this constant_expression break; default: // statements executed if expression does not equal // any case constant_expression >
Оператор break можно использовать для завершения обработки определенного оператора с меткой в операторе switch . Он выполняет ветвление до конца оператора switch . Без оператора break выполнение программы продолжается до следующего оператора с меткой. Операторы будут выполняться до достижения оператора break или конца всего оператора. В некоторых случаях может требоваться именно такое поведение.
Оператор default выполняется, если ни одно из значений case constant-expression не равно значению expression . Если оператор default не указан и соответствующий вариант case не найден, ни один из операторов в теле оператора switch не выполняется. Допускается не более одного оператора default . Оператор default не обязательно должен находиться в конце. Он может располагаться в любом месте тела оператора switch . Метка case или default может располагаться только внутри оператора switch .
Выражения switch expression и case constant-expression должны быть целочисленного типа. Значение каждого case constant-expression в теле оператора должно быть уникальным.
Метки case и default тела оператора switch имеют значения только при начальной проверке, которая определяет, с какого места тела оператора начинается выполнение. Операторы switch могут быть вложенными. Любые статические переменные инициализируются до выполнения любых операторов switch .
Объявления могут располагаться в начале составного оператора, образующего тело оператора switch , но инициализации, включенные в объявления, не выполняются. Оператор switch передает управление непосредственно на выполняемый оператор в теле, минуя все строки, содержащие инициализации.
В следующих примерах кода показаны операторы switch :
switch( c )
В этом примере, если переменная c равна 'A' , выполняются все три оператора тела switch , так как оператор break перед следующим оператором case отсутствует. Управления передается первому оператору ( capital_a++; ) и продолжается по-порядку во всей остальной части тела. Если переменная c равна 'a' , увеличиваются значения переменных letter_a и total . Если переменная c не равна 'A' или 'a' , увеличивается только значение переменной total .
switch( i )
В этом примере оператор break указан после каждого оператора тела switch . Оператор break вызывает принудительный выход из тела оператора после выполнения одного оператора. Если переменная i равна –1, увеличивается только значение переменной n . Оператор break после оператора n++; передает управление за пределы тела оператора, минуя оставшиеся операторы. Аналогично, если переменная i равна 0, увеличивается только значение переменной z ; если переменная i равна 1, увеличивается только значение переменной p . Заключительный оператор break , строго говоря, не требуется, так как управление передается из тела в конце составного оператора. Он добавлен для единообразия.
Один оператор может содержать несколько меток case , как показано в следующем примере:
switch( c )
В этом примере, если constant-expression равно любой букве между 'a' и 'f' , convert_hex вызывается функция .
Специально для систем Майкрософт
Microsoft C не ограничивает количество значений case в операторе switch . Это число ограничивается только объемом доступной памяти. ANSI C требует, чтобы в операторе switch можно было использовать не менее 257 меток case .
В Microsoft C расширения Майкрософт по умолчанию (default) включены. Используйте параметр компилятора /Za для отключения этих расширений.
switch-case в C++: что это и как с ней работать
Всем привет! В C++ благодаря условным операторам if и else можем выбирать по какому пути идти. Но если нам понадобится проверить несколько выражений, использовать оператор if будет не разумно из-за того что в C++ есть - switch.
Что такое switch
Это множественный условный оператор. Он работает также как несколько условий if, но может проверять лишь одну переменную в своих условиях. Если одно условие является правильным происходит выход.
Для его использования не нужно подключать какие-то дополнительные библиотеки, кроме стандартной .
switch (переменная) >
Для проверки условия нужно использовать конструкцию case:
switch (x) case проверяемое значение >: cout <""; // ваш var a = 5; // блок кода break; >
После слова case используются : (двоеточие), а в самом ее конце должен присутствовать оператор break .
Чтобы проще ориентироваться в коде можно применять скобки.
case 5: // что то выполняется break; >
Что такое default
Он работает лишь когда все case являются не верными. В конструкции использовать не обязательно.
int x = 9; switch (x) case 5: cout <"Значение равно 5"; break; case 6: cout <"Значение равно 6"; break; case 0: cout <"Значение равно zero"; break; default: cout <"Значение не равно 5, 6 и даже 0"; >
Значение не равно 5, 6 и даже zero Process returned 0 (0x0) execution time : 0.010 s Press any key to continue.
Если ни одно case и default не правильны, то программа выйдет из switch и продолжит работать дальше.
Пример использования switch
Давайте сделаем программу с использованием switch. Смысл программы будет заключаеться в нахождении суммы, разности, умножения, деления двух чисел, которые, как и операции будет выбирать пользователь.
int str; int first, second; cout "Введите первое число: "; cin >> first; cout "Введите второе число: "; cin >> second; cout "Укажите какую операцию использовать: "cin >> str; switch (str) case 5: cout "Сумма: " first + second; break; case 8: cout "Вычитание: " first - second; break; case 9: cout "Умножение: " first * second; break; case 7: cout "Деление: " first / second; break; default: cout "Что-то пошло не так. Повторите попытку"; >
- В строках 10, 13, 16, 19: применяется проверка значений str .
- В строке 22: если пользователь ошибся с числом, то программа его оповестит с помощью оператора default .
Вот пример успешного выполнения программы:
Введите первое число: 5 Введите первое число: 7 Укажите какую операцию использовать: 9 Умножение: 35 Process returned 0 (0x0) execution time : 0.010 s Press any key to continue.
Вот и все! Надеемся этот урок был для вас полезен. Удачи!
Читайте также
Цикл do while в C++
В очередном уроке по C++ мы пройдем цикл do while. В этом уроке вы узнаете как его просто реализовать и закрепим пройденные знания на примере. Удачи!
Область видимости переменных в C++
В данном уроке мы познакомим вас с областью видимости C++. Вы узнаете, что такое локальные переменные, глобальные переменные и как правильно ими пользоваться.
Мы рассмотрим создание программы, ее структуру, а также главные правила синтаксиса языка C++.
Логические выражения в C++