Switch в языке си

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:

  1. switch отличается от if тем, что он может выполнять только операции проверки строгого равенства, в то время как if может вычислять логические выражения и отношения.
  2. Не может быть двух констант в одном операторе switch, имеющих одинаковые значения. Конечно, оператор switch, включающий в себя другой оператор switch, может содержать аналогичные константы.
  3. Если в операторе switch используются символьные константы, они автоматически преобразуются к целочисленным значениям.

Оператор switch часто используется для обработки команд клавиатуры типа работа с меню. Как показано ниже, функция menu() отображает меню для программы проверки орфографии и вызывает соответствующие процедуры:

void menu(void)
<
char ch;

printf("1. Check Spelling
");
printf("2. Correct Spelling Errors
");
printf("3. Display Spelling Errors
");
printf("Strike Any Other Key to Skip
");
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, позволяет создавать эффективный код, поскольку это избавляет от необходимости дублировать код.

Читайте также:  Aerocool aero 500 реобас

Важно понять, что операторы, ассоциированные с каждой меткой, являются не блоками кода, а скорее последовательностью операторов. (Сам оператор switch определяет блок.) Понимание этого необходимо в некоторых специфических ситуациях. Например, следующий фрагмент кода содержит ошибку и не будет компилироваться, поскольку невозможно объявить переменную в последовательности операторов:

Тем не менее переменная может быть добавлена:

Имеется возможность создания блока кода как одного из операторов в последовательности и объявление в нем переменной, как показано ниже:

Оператор Switch

Р ассмотрим пример из темы "ветвления". Программа выводит название дня недели по порядковому номера

Этот код состоит из семи идущих друг за другом операторов if. Его код можно упростить с помощью оператора switch

Оператор switch принимает в качестве аргумента число, и в зависимости от его значения выполняет те или иные команды.

Если значение переменной не соответствует ни одному case, то выполняется default ветвь. Она может отсутствовать, тогда вообще ничего не выполняется.
В примере выше каждая ветвь оканчивается оператором break. Это важно. Когда компьютер видит оператор break, он выходит из оператора switch. Если бы он отсутствовал, то программа "провалилась" бы дальше, и стала выполнять следующие ветви.

Введите значение, например 3, и вы увидите, что программа выведет
WednesdayThursdayFridaySaturday то есть все ветви, после найденной.
Операторы каждой из ветвей могут быть обрамлены фигурными скобками (и так даже лучше). Тогда каждая из ветвей будет отдельным блоком, в котором можно определять свои переменные. Пример программы, которая запрашивает у пользователя число, оператор и второе число и выполняет действие.

Если ввести
1 + 2
то будет выведен результат операции 1 + 2 = 3
Хочу обратить внимание, что литеры типа ‘+’ и т.п. воспринимаются в качестве чисел, поэтому их можно использовать в операторе switch. В этой программе использовалась функция exit из библиотеки stdlib. Функция останавливает работу программы и возвращает результат её работы. Если возвращается истина (ненулевое значение), то это значит, что программа была выполнена с ошибкой.

Ветвь default может располагаться в любом месте, не обязательно в конце. Этот код также будет нормально работать

default здесь также нуждается в операторе break, как и другие ветви, иначе произойдёт сваливание вниз. Несмотря на то, что так можно писать, это плохой стиль программирования. Ветвь default логически располагается в конце, когда других вариантов больше нет.

Возможные значения аргумента оператора switch могут располагаться в любом порядке, но должны быть константными значеними. Это значит, что следующий код не заработает

Операторы switch и case помогают управлять сложными условными операциями и операциями ветвления. The switch and case statements help control complex conditional and branching operations. Оператор switch передает управление в оператор внутри своего тела. The switch statement transfers control to a statement within its body.

Синтаксис Syntax

selection-statement: selection-statement:
switch ( expression ) statement switch ( expression ) statement

labeled-statement: labeled-statement:
case constant-expression : statement case constant-expression : statement
default : statement default : statement

Управление передается оператору, значение выражения case константное выражение которого соответствует значению выражения switch ( выражение ). Control passes to the statement whose case constant-expression matches the value of switch ( expression ). Оператор switch может содержать любое число экземпляров case, но никакие две константы варианта в одном операторе switch не могут иметь одинаковые значения. The switch statement can include any number of case instances, but no two case constants within the same switch statement can have the same value. Выполнение тела оператора начинается с выбранного оператора и продолжается до конца тела оператора или пока управление не будет передано за пределами тела оператора с помощью оператора break. Execution of the statement body begins at the selected statement and proceeds until the end of the body or until a break statement transfers control out of the body.

Читайте также:  Panasonic hc v770ee k обзор

Оператор switch обычно используется следующим образом: Use of the switch statement usually looks something like this:

Оператор break можно использовать для завершения обработки определенного варианта в операторе switch и перехода в конец оператора switch . You can use the break statement to end processing of a particular case within the switch statement and to branch to the end of the switch statement. Без оператора break выполнение программы будет продолжено в следующем варианте и операторы будут выполняться до достижения оператора break или конца всего оператора. Without break, the program continues to the next case, executing the statements until a break or the end of the statement is reached. В некоторых случаях может требоваться именно такое поведение. In some situations, this continuation may be desirable.

Оператор default выполняется, если ни одно из значений case константное выражение не равно значению switch ( выражение ). The default statement is executed if no case constant-expression is equal to the value of switch ( expression ). Если оператор default не указан и соответствующий вариант case не найден, ни один из операторов в теле оператора switch не выполняется. If the default statement is omitted, and no case match is found, none of the statements in the switch body are executed. Допускается не более одного оператора default. There can be at most one default statement. Оператор default не обязательно должен находиться в конце; он может располагаться в любом месте тела оператора switch . The default statement need not come at the end; it can appear anywhere in the body of the switch statement. Метка case или default может располагаться только внутри оператора switch . A case or default label can only appear inside a switch statement.

Выражения switch выражение и case константное выражение должны быть целочисленного типа. The type of switch expression and case constant-expression must be integral. Значение каждого константного выражения case в теле оператора должно быть уникальным. The value of each case constant-expression must be unique within the statement body.

Метки case и default тела оператора switch имеют значения только при начальной проверке, которая определяет, с какого места тела оператора начинается выполнение. The case and default labels of the switch statement body are significant only in the initial test that determines where execution starts in the statement body. Операторы switch могут быть вложенными. Switch statements can be nested. Любые статические переменные инициализируются до выполнения любых операторов switch . Any static variables are initialized before executing into any switch statements.

Объявления могут располагаться в начале составного оператора, образующего тело оператора switch , но инициализации, включенные в объявления, не выполняются. Declarations can appear at the head of the compound statement forming the switch body, but initializations included in the declarations are not performed. Оператор switch передает управление непосредственно на выполняемый оператор в теле, минуя все строки, содержащие инициализации. The switch statement transfers control directly to an executable statement within the body, bypassing the lines that contain initializations.

Читайте также:  Plc rotek fe 500 rp 501 1

В следующих примерах кода показаны операторы switch : The following examples illustrate switch statements:

В этом примере, если переменная switch равна c , выполняются все три оператора тела ‘A’ , так как оператор break перед следующим оператором case отсутствует. All three statements of the switch body in this example are executed if c is equal to ‘A’ since a break statement does not appear before the following case. Управления передается первому оператору ( capa++; ) и продолжается по-порядку во всей остальной части тела. Execution control is transferred to the first statement ( capa++; ) and continues in order through the rest of the body. Если переменная c равна ‘a’ , увеличиваются значения переменных lettera и total . If c is equal to ‘a’ , lettera and total are incremented. Если переменная total не равна c или ‘A’ , увеличивается только значение переменной ‘a’ . Only total is incremented if c is not equal to ‘A’ or ‘a’ .

В этом примере оператор break указан после каждого оператора тела switch . In this example, a break statement follows each statement of the switch body. Оператор break вызывает принудительный выход из тела оператора после выполнения одного оператора. The break statement forces an exit from the statement body after one statement is executed. Если переменная i равна –1, увеличивается только значение переменной n . If i is equal to -1, only n is incremented. Оператор break после оператора n++; передает управление за пределы тела оператора, минуя оставшиеся операторы. The break following the statement n++; causes execution control to pass out of the statement body, bypassing the remaining statements. Аналогично, если переменная i равна 0, увеличивается только значение переменной z ; если переменная i равна 1, увеличивается только значение переменной p . Similarly, if i is equal to 0, only z is incremented; if i is equal to 1, only p is incremented. Заключительный оператор break, строго говоря, не требуется, так как управление передается из тела в конце составного оператора, но он добавлен для единообразия. The final break statement is not strictly necessary, since control passes out of the body at the end of the compound statement, but it is included for consistency.

Один оператор может содержать несколько меток case, как показано в следующем примере: A single statement can carry multiple case labels, as the following example shows:

В этом примере, если константное выражение равно любой букве в диапазоне от ‘a’ до ‘f’ , вызывается функция hexcvt . In this example, if constant-expression equals any letter between ‘a’ and ‘f’ , the hexcvt function is called.

Блок, относящийся только к системам Microsoft Microsoft Specific

Microsoft C не ограничивает количество значений case в операторе switch . Microsoft C does not limit the number of case values in a switch statement. Это число ограничивается только объемом доступной памяти. The number is limited only by the available memory. ANSI C требует, чтобы в операторе switch можно было использовать не менее 257 меток case. ANSI C requires at least 257 case labels be allowed in a switch statement.

В Microsoft C расширения Microsoft по умолчанию включены. The default for Microsoft C is that the Microsoft extensions are enabled. Используйте параметр компилятора /Za для отключения этих расширений. Use the /Za compiler option to disable these extensions.

Завершение блока, относящегося только к системам Майкрософт END Microsoft Specific

Ссылка на основную публикацию
Adblock detector