Update and fix riussian translation of switch statement (#34013)

This commit is contained in:
Aleksei Aksenov
2019-08-08 01:06:45 +03:00
committed by Randell Dawson
parent 04c5d1e948
commit 2e727785fb

View File

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