Конструкция «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
Как мы уже выяснили, оператор if позволяет сделать выбор одного из двух возможных продолжений. Если вариантов выбора более двух, то можно использовать вложенные операторы if . Но это не всегда удобно. Когда счёт вариантов выбора идёт на десятки (а может быть, и на сотни!), то применение if становится совершенно неудобным. Для таких случаев рекомендуют использовать специальный оператор switch .
Оператор switch — это оператор для выбора одного из многих продолжений. Схематично этот оператор можно изобразить так:
Формальная запись этого оператора на С/С++ выглядит так:
case Константа1 : Операторы1 ; break;
case Константа2 : Операторы2 ; break;
case КонстантаN : Операторы N ; break;
Операторы по умолчанию ;
Здесь Выражение — это любое выражение целого типа (чаще — просто переменная), например типа char или int .
Далее в блоке за заголовком мы видим набор конструкций вида
case Константа : Операторы ; break;
В них Константа — это константа того же целого типа, что и Выражение . Операторы — любые исполняемые операторы. Количество их произвольное, оформлять блоком не требуется.
Алгоритм работы оператора switch :
Вычисляется значение Выражения .
Затем среди рассмотренных выше конструкций ищется такая, которая начинается с Константы , равной значению Выражения . Если Константа найдена, то выполняются следующие за ней Операторы . Оператор break осуществляет выход из оператора switch . Если ни одна из Констант не равна значению Выражения , то выполняется ветвь default (по умолчанию), и оператор заканчивает работу.
Ветвь default в операторе switch может отсутствовать. В этом случае, если ни одна из ветвей не соответствует значению Выражения , то делается выход из оператора switch .
Количество вариантов в операторе switch ни чем не ограничено. В принципе, они все могут отсутствовать (как и ветвь default ) , то есть вполне можно написать:
но фигурные скобки за заголовком должны быть всегда .
Пример 1 . По номеру дня недели вывести на экране монитора название этого дня недели.
Возможный вариант решения:
using namespace std;
// Для нормальной русификации в консольных приложениях
char * rus(char *s);
int n; // Номер дня недели
Arduino.ru
Подобно конструкции if, switch. case управляет процессом выполнения программы, позволяя программисту задавать альтернативный код, который будет выполняться при разных условиях. В частности, оператор switch сравнивает значение переменной со значением, определенном в операторах case. Когда найден оператор case, значение которого равно значению переменной, выполняется программный код в этом операторе.
Ключевое слово break является командой выхода из оператора case и обычно используется в конце каждого case. Без оператора break оператор switchбудет продолжать вычислять следующие выражения, пока не достигнет break или конец оператора switch.
Пример
switch (var) < case 1: //выполняется, когда var равно 1 break; case 2: //выполняется когда var равно 2 break; default: // выполняется, если не выбрана ни одна альтернатива // default необязателен >
Синтаксис:
switch (var) < case label: // код для выполнения break; case label: // код для выполнения break; default: // код для выполнения >
Параметры:
- var: переменная, которая вычисляется для сравнения с вариантами в case
- label: значение, с которым сравнивается значение переменной
SWITCH
Хотя конструкция if-else-if может выполнять многочисленные проверки, она не очень элегантна. Код очень труден для восприятия и в нем может запутаться даже автор через некоторое время. С этой целью С имеет оператор принятия решений switch, выполняющий действия, основываясь на сравнении значения со списком констант символов или целых чисел. При обнаружении совпадения выполняется оператор или операторы, ассоциированные с данным значением. Оператор switch имеет следующий вид:
switch (выражение) case константа1:
последовательность операторов
break;
case константа2:
последовательность операторов
break;
case константа3:
последовательность операторов break;
.
default:
последовательность операторов
>
Оператор default выполняется, если не найдено соответствий, default необязателен и, если его нет, то в случае отсутствия совпадений ничего не происходит. Когда обнаруживается совпадение, операторы, ассоциированные с соответствующим case, выполняются до тех пор, пока не встретится оператор break. В случае default (или последнего case, если отсутствует default), оператор switch заканчивает работу при обнаружении конца.
Следует знать о трех важных моментах оператора switch:
- switch отличается от if тем, что он может выполнять только операции проверки строгого равенства, в то время как if может вычислять логические выражения и отношения.
- Не может быть двух констант в одном операторе switch, имеющих одинаковые значения. Конечно, оператор switch, включающий в себя другой оператор switch, может содержать аналогичные константы.
- Если в операторе switch используются символьные константы, они автоматически преобразуются к целочисленным значениям.
Оператор switch часто используется для обработки команд клавиатуры типа работа с меню. Как показано ниже, функция menu() отображает меню для программы проверки орфографии и вызывает соответствующие процедуры:
void menu(void)
char ch;
printf(«1. Check Spelling\n»);
printf(«2. Correct Spelling Errors\n»);
printf(«3. Display Spelling Errors\n»);
printf(«Strike Any Other Key to Skip\n»);
printf (» Enter your choice: «);
ch = getche(); /* чтение клавиатуры */
switch(ch) case ‘1’:
check_spelling();
break;
case ‘2’:
correct_errors();
break;
case ‘3’;
display_errors();
break;
default :
printf(«No option selected»);
>
>
С технической точки зрения операторы break являются необязательными в операторе switch. Они используются для окончания работы последовательности операторов, ассоциированных с данной константой. Если оператор break отсутствует, продолжают выполняться операторы следующего раздела, пока не будет достигнут оператор break или конец оператора switch. О константах выбора можно думать как о метках. Выполнение начинается с метки, соответствующей искомому значению, и продолжается, пока не будет достигнут break или конец оператора switch. Например, функция, показанная ниже, использует данную особенность оператора case для упрощения кода обработчика ввода драйвера устройства:
void inp_handler(void)
int ch, flag;
ch = read_device(); /* чтение какого-то устройства */
flag = -1;
switch(ch) case 1: /* данные случаи имеют общую последовательность */
case 2: /* операторов */
case 3:
flag = 0;
break;
case 4:
flag = 1;
case 5:
error(flag);
break;
default:
process(ch);
>
>
Данная подпрограмма иллюстрирует две грани оператора switch. Во-первых, можно иметь пустые условия. В данном случае первые три условия приводят к выполнению одних и тех же операторов:
Во-вторых, выполнение переходит к следующему case, если отсутствует break. Если ch соответствует 4, то flag устанавливается в 1, и, поскольку отсутствует оператор break, выполнение продолжается и выполняется оператор error(flag). В данном случае flag имеет значение 1. Если ch равно 5, то вызывается error(flag), а значение flag будет равно — 1. Способность запускать несколько операторов, соответствующих нескольким условиям при отсутствии оператора break, позволяет создавать эффективный код, поскольку это избавляет от необходимости дублировать код.
Важно понять, что операторы, ассоциированные с каждой меткой, являются не блоками кода, а скорее последовательностью операторов. (Сам оператор switch определяет блок.) Понимание этого необходимо в некоторых специфических ситуациях. Например, следующий фрагмент кода содержит ошибку и не будет компилироваться, поскольку невозможно объявить переменную в последовательности операторов:
Тем не менее переменная может быть добавлена:
Имеется возможность создания блока кода как одного из операторов в последовательности и объявление в нем переменной, как показано ниже:
![]() |
ЗАМЕТКА: Все ранее обсуждаемое применимо только к С, но не к С++. В С++ можно объявлять переменную в любой точке, в том числе в последовательности операторов. |
