89 lines
6.2 KiB
Markdown
89 lines
6.2 KiB
Markdown
|
---
|
|||
|
title: Switch Case
|
|||
|
localeTitle: Корпус выключателя
|
|||
|
---
|
|||
|
# Корпус выключателя
|
|||
|
|
|||
|
Оператор switch похож на набор `if statements` .
|
|||
|
|
|||
|
Это список возможностей с действием для каждой возможности и необязательным действием по умолчанию, если ничто иное не оценивает значение true.
|
|||
|
|
|||
|
Мы выходим из коммутатора на `break` . Если оператор `break` не будет достигнут до начала следующего случая, выполнение провалится и начнет выполнение кода в следующем случае.
|
|||
|
|
|||
|
## Синтаксис переключателя ... case
|
|||
|
|
|||
|
```c
|
|||
|
switch (n)
|
|||
|
{
|
|||
|
case constant1:
|
|||
|
// code to be executed if n is equal to constant1;
|
|||
|
break;
|
|||
|
|
|||
|
case constant2:
|
|||
|
// code to be executed if n is equal to constant2;
|
|||
|
break;
|
|||
|
.
|
|||
|
.
|
|||
|
.
|
|||
|
default:
|
|||
|
// code to be executed if n doesn't match any constant
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## пример
|
|||
|
|
|||
|
Использование оператора switch над несколькими операторами if / else может способствовать большей скорости и удобочитаемости.
|
|||
|
|
|||
|
```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 is doesn't match any case constant (+, -, *, /)
|
|||
|
default:
|
|||
|
printf("Error! operator is not correct");
|
|||
|
}
|
|||
|
|
|||
|
return 0;
|
|||
|
}
|
|||
|
```
|
|||
|
|
|||
|
## Вывод:
|
|||
|
|
|||
|
```c
|
|||
|
-> Enter an operator (+, -, *,): -
|
|||
|
-> Enter two operands: 32.5
|
|||
|
-> 12.4
|
|||
|
-> 32.5 - 12.4 = 20.1
|
|||
|
```
|
|||
|
|
|||
|
## Обзор: Switch vs if else
|
|||
|
|
|||
|
* Проверьте выражение тестирования: оператор if-then-else может тестировать выражения на основе диапазонов значений или условий, тогда как оператор switch проверяет выражения, основанные только на одном целочисленном, перечисляемом значении или объекте String.
|
|||
|
* Лучше переключайтесь на многопоточность: когда компилятор компилирует оператор switch, он проверяет каждую из констант case и создает «таблицу перехода», которую он будет использовать для выбора пути выполнения в зависимости от значения выражения. Поэтому, если нам нужно выбрать среди большой группы значений, оператор switch будет работать намного быстрее, чем эквивалентная логическая кодировка с использованием последовательности if-elses. Компилятор может это сделать, потому что он знает, что константы case имеют одинаковый тип и просто должны сравниваться для равенства с выражением switch, тогда как в случае выражений компилятор не имеет таких знаний.
|
|||
|
* if-else лучше для логических значений: If-else условные ветви отлично подходят для переменных условий, которые приводят к булевому, тогда как операторы switch отлично подходят для фиксированных значений данных.
|
|||
|
* Скорость. Оператор switch может оказаться быстрее, чем если бы при условии, что количество дел является хорошим. Если есть только несколько случаев, это может не повлиять на скорость в любом случае. Переключатель предпочтений, если число случаев больше, чем 5, иначе вы можете использовать if-else.
|
|||
|
* Если коммутатор содержит более пяти элементов, он реализуется с помощью таблицы поиска или хеш-листа. Это означает, что все элементы получают одинаковое время доступа по сравнению со списком if: s, где последний элемент занимает гораздо больше времени для достижения, поскольку он должен сначала оценивать каждое предыдущее условие.
|
|||
|
* Ясность в удобочитаемости: коммутатор выглядит намного чище, когда вам приходится комбинировать случаи. Ifs также очень уязвимы для ошибок. Отсутствие заявления другого может нанести вам ущерб. Добавление и удаление меток также проще с помощью переключателя и делает ваш код значительно легче изменять и поддерживать.
|