Конструкция switch case на языке C

Язык C

Switch-case в языках C и C++ является оператором выбора. Также он называется оператором принятия решений. Её общая форма представляет собой конструкцию, приведённую ниже:

switch<выражение> {
case<константа 1>:
<инструкции для выполнения>
break;

case<константа n>:
<инструкции для выполнения>
break;
default:
<инструкции для выполнения>
}

Блоки, начинающиеся со слов caseили defaultназываются лейблами. На английском языке label значит метка.
Тип лейбла со словом caseсодержит константу. Её значение может принимать выражение после слова switch.
Константа после слова case может быть либо литералом, либо перечислением, либо непосредственно самой константой (т. е. переменной, которая объявлена со словом const). После константы ставится двоеточие и описываются операторы, которые должны при этом выполниться.

Метка со словом default содержит инструкции, которые должны выполниться в том случае, если выражение после switchприняло значение, отличное от тех, что есть в блоках case. Оператор break в этом label’е не нужен.

Внутри лейбла case можно использовать сразу несколько операторов, не заключая их в фигурные скобки. Таким образом, код, приведённый ниже, будет считаться корректным:

intnum = 3;
switch(num)
{
case 1: // внутри этой метки объявлены сразу 3 оператора
printf(«Result: One \n»);
printf(«Result: Number 1»);
break;
case 2:
printf(«Result: Two \n»);
printf(«Result: Number 2»);
break;
case 3:
printf(«Result: Three\n»);
printf(«Result: Number 3»);
break;
default: // Если число не найдено по предыдущим меткам, то выполняетсялейбл по умолчанию
printf(«Result: Another number»);
}

Вывод:

Result:Three
Result: Number 3

Отличия switch-case от if-else

Множественный выбор также можно реализовать при помощи нескольких объединённых конструкций if-else. Однако оператор switch для этого в отличие от условного оператора более компактен и прост в использовании. Если искомое выражение может принимать больше двух значений, то в большинстве случаев лучше использовать именно switch-case.

Приведённые ниже коды, использующие конструкции if-else и switch-case эквивалентны в языке C.

If-else

char c = ‘2’;
if (c == ‘1’)
printf(«Result number is1»);
else
if (c == ‘2’)
printf(«Result number is2»);
else
if (c == ‘3’)
printf(«Result number is3»);
else
printf(«Another number»);

Вывод:

Result number is2

Switch-case

char c = ‘2’;
switch(c)
{
case ‘1’:
printf(«Result: One»);
break;
case ‘2’:
printf(«Result: Two»);
break;
case ‘3’:
printf(«Result: Three»);
break;
default:
printf(«Alternative choice»);
}

Вывод:

Result:Two

Сравнение switch в C и C++

В обоих языках нельзя инициализировать переменные внутри метки case. Такая запись не будет скомпилирована:

int numb = 3;
switch(numb)
{
case 1:
intt = 1; // объявляем и присваиваем значение переменной одновременно
printf(«Result: One»);
break;
default:
printf(«Other number»);
}

Тем не менее, в языке C++ можно разделить инициализацию переменной на 2 части: её объявление и присваивание. В языке С это не сработает. Такая программа будет корректна для C++:

int d;
boolb_var;
d = 3;
switch (d)
{
case 1:
intt;// разбиваем инициализацию на 2 команды
t = 1;
b_var = false;
break;

default:
b_var = true;
break;
}

Но инициализировать переменную внутри лейбла всё-таки можно. Для того, чтобы сделать это,нужно заключить код в фигурные скобки. Этот код будет рабочим для обоих языков:

intind;
boolbool_var;
ind = 2;
switch (ind)
{
case 1:
{
int t = 1;
bool_var = false;
break;
}
default:
bool_var = true;
break;
}

Другие примеры использования switch-case

Как уже говорилось выше, оператор switchумеет работать с перечисляемым типом. Ниже приведен пример такого кода:

enum Days {
DAY_SUN,
DAY_MON,
DAY_TUES,
DAY_WEDNES,
DAY_THURS,
DAY_FRI,
DAY_SATUR,
};

int d = 1;
switch(d)
{
caseDAY_MON:
printf(«Day: Monday»);
break;
caseDAY_TUES:
printf(«Day: Tuesday»);
break;
default:
printf(«Otherwise»);
}

Вывод:

Day: Monday

Выражение после слова case также может быть константой. Но это применимо только для языка C++. Пример кода:

constintNumbOne = 1;
constintNumbTwo = 2;

int dig = 1;
stringStrDig;
switch(dig)
{
caseNumbOne:
StrDig = «One»;
break;
caseNumbTwo:
StrDig = «Two»;
break;
default:
StrDig = «Other digit»;
}
cout<<StrDig;

Вывод:

One

В операторе switch недопустимо использование нескольких case c одним и тем же значением. Этот код не скомпилируется:

constintOne = 1;
constint Two = 2;

int digit = 1;
switch(digit)
{
case 1:
printf(«Digit 1»);
break;
caseOne://константа One объявлена со значением 1, поэтому возникает повтор и происходит ошибка компиляции
printf(«Digit: One»);
break;
case Two:
printf(«Digit: Two»);
break;
default:
printf(«Otherdigit»);
}

В этом коде также возникнет ошибка:

enum Days {
SUN,
MON,
TUES,
WEDN,
THUR,
FRI,
SATUR,
};
intDayNumber = 1;
switch(DayNumber)
{
case 1:
printf(«Day One»);
break;
caseMON:// MON имеет индекс 1 в перечислении, поэтому происходит повтор
printf(«Day: MON»);
break;
default:
printf(«Another day»);
}

Оператор switch может быть вложен в другой switch.

Пример программы:

int n = 1, t = 12;
switch(n)
{
case 1:
printf («Result day: Monday»);
switch (t)
{
case 12:
printf («noon»);
break;
default:
printf («not noon»);
}
break;
case 2:
printf («Result day: Tuesday»);
break;
case 3:
printf («Result day: Wednesday»);
break;
default:
printf («Result: Other day»);
}

Вывод:

Result day: Monday

noon

Об операции break

Операция break необязательна в операторе выбора.Если её не использовать, то продолжат выполняться операторы, которые находятся в следующих лейблах. Пример подобной программы:

enumDays {
Su,
M,
Tu,
W,
Th,
F,
Sa,
};

int n = 0;
switch(n)
{
caseM: // объявление нескольких меток caseподряд
caseTu:
case W:
caseTh:
case F:
printf («Working day.»);
case Sa:
case Su:
printf(«Day off»);
}

Вывод:

Day off

Оцените статью
Образовательный портал WELCOME4U.RU
Добавить комментарий

Adblock
detector