Files
freeCodeCamp/guide/russian/c/switch/index.md

90 lines
6.5 KiB
Markdown
Raw Normal View History

2018-10-12 16:00:59 -04:00
---
title: switch case
localeTitle: switch case
2018-10-12 16:00:59 -04:00
---
# switch case
2018-10-12 16:00:59 -04:00
Оператор switch похож на набор операторов `if` .
2018-10-12 16:00:59 -04:00
Он представляет собой список возможных вариантов, с действием для каждого варианта и необязательным действием по умолчанию, если ни один вариант не сработал.
2018-10-12 16:00:59 -04:00
Мы выходим из оператора switch с помощью `break` . Если оператор `break` не будет встречен до начала следующей метки case, программа начнет выполнять инструкции следующей метки case.
2018-10-12 16:00:59 -04:00
## Синтаксис switch...case
2018-10-12 16:00:59 -04:00
```c
switch (n)
{
case constant1:
// код, который необходимо выполнить в случае, если n равно constant1;
2018-10-12 16:00:59 -04:00
break;
case constant2:
// код, который необходимо выполнить в случае, если n равно constant2;
2018-10-12 16:00:59 -04:00
break;
.
.
.
default:
// код, который необходимо выполнить в случае, если n не равно ни одной из констант
2018-10-12 16:00:59 -04:00
}
```
## Пример
2018-10-12 16:00:59 -04:00
Использование оператора switch вместо нескольких операторов if/else может способствовать большей скорости и удобочитаемости.
2018-10-12 16:00:59 -04:00
```c
# include <stdio.h>
int main() {
char operator;
double firstNumber,secondNumber;
printf("Enter an operator (+, -, *, /): ");
scanf("%c", &operator);
printf("Enter two operands: ");
scanf("%lf %lf",&firstNumber, &secondNumber);
switch (operator) {
case '+':
printf("%.1lf + %.1lf = %.1lf",firstNumber, secondNumber, firstNumber+secondNumber);
break;
case '-':
printf("%.1lf - %.1lf = %.1lf",firstNumber, secondNumber, firstNumber-secondNumber);
break;
case '*':
printf("%.1lf * %.1lf = %.1lf",firstNumber, secondNumber, firstNumber*secondNumber);
break;
case '/':
printf("%.1lf / %.1lf = %.1lf",firstNumber, secondNumber, firstNumber/firstNumber);
break;
// operator не равен ни одной из констант в case (+, -, *, /)
2018-10-12 16:00:59 -04:00
default:
printf("Error! Operator is not correct");
2018-10-12 16:00:59 -04:00
}
return 0;
}
```
## Вывод:
```
-> Enter an operator (+, -, *,): -
2018-10-12 16:00:59 -04:00
-> Enter two operands: 32.5
-> 12.4
-> 32.5 - 12.4 = 20.1
```
## Обзор: switch vs if/else
2018-10-12 16:00:59 -04:00
* Проверьте выражение тестирования: оператор if/else может тестировать выражения на основе диапазонов значений или условий, тогда как оператор switch проверяет выражения, основанные только на одиночном целом числе, перечисляемом значении или строке.
* switch более подходит для множественных ветвлений: когда компилятор компилирует оператор switch, он проверяет каждую из констант case и создает «таблицу переходов», которую он будет использовать для выбора пути выполнения в зависимости от значения выражения. Поэтому, если нам нужно выбрать среди большой группы значений, оператор switch будет работать намного быстрее, чем эквивалентная логика, реализованная с использованием последовательности операторов if/else. Компилятор может это сделать, потому что он знает, что константы case имеют одинаковый тип и просто должны сравниваться на равенство с выражением switch, тогда как в случае операторов if у компилятора нет таких сведений.
* if/else лучше для логических значений: условные ветви оператора if/else отлично подходят для переменных условий, которые вычисляются в булево значение, тогда как операторы switch отлично подходят для фиксированных значений данных.
* Скорость. Оператор switch может оказаться быстрее чем if/else, при условии, достаточно большого количества меток case. Если меток case мало, это может не оказать влияние на скорость. Отдавайте предпочтение switch в случае, когда количество меток case превышает 5, иначе можно также использовать if/else.
* Если switch содержит более пяти веток, он реализуется с помощью таблицы поиска или хеш-листа. Это означает, что все элементы получают одинаковое время доступа, в отличие от списка веток if/else, где достижение последнего элемента занимает гораздо больше времени, поскольку необходимо вычислить все предыдущие условия.
* Ясность и удобочитаемость: switch выглядит намного чище, если вам приходится комбинировать метки case. Операторы if помимо прочего очень уязвимы для ошибок. Пропущенное ключевое слово else может нанести вам большой ущерб. Добавление и удаление меток в операторе switch значительно проще и делает ваш код значительно легче модифицируемым и поддерживаемым.