C (Си): Switch вместо if/else
В этом уроке разберем, как заменить длинную цепочку if/else if/else на switch.
Для примера возьмем функцию charcode(), которая получает символ и возвращает код:
- Для символа
'a'функция возвращает0. - Для символа
'b'функция возвращает1. - Для любого другого символа функция возвращает
3.
Вариант через if else if else
int charcode(char c)
{
if (c == 'a')
return 0;
else if (c == 'b')
return 1;
else
return 3;
}Здесь важно:
- Для сравнения используем
==, а не=. - Оператор
=выполняет присваивание. - Оператор
!=означает "не равно".
Вариант через switch
int charcode(char c)
{
switch (c) {
case 'a':
return 0;
case 'b':
return 1;
default:
return 3;
}
}Ключевое слово case задает отдельные варианты, а default задает ветку для всех остальных значений.
Почему важен break
В switch есть важная особенность: если не поставить break, выполнение "проваливается" в следующий case.
Пример с ошибкой:
int charcode(char c)
{
int p;
switch (c) {
case 'a':
p = 0;
case 'b':
p = 1;
default:
p = 3;
}
return p;
}Если передать 'a', результатом все равно станет 3, потому что выполнятся все ветки подряд.
Правильный вариант:
int charcode(char c)
{
int p;
switch (c) {
case 'a':
p = 0;
break;
case 'b':
p = 1;
break;
default:
p = 3;
break;
}
return p;
}Теперь поведение корректное:
- Для символа
'a'функция возвращает0. - Для символа
'b'функция возвращает1. - Для любого другого символа функция возвращает
3.
Итоги
- Конструкция
switchудобна для выбора из нескольких конкретных значений. - Почти в каждом
caseнуженbreak, чтобы не было fallthrough. - Ветка
defaultпокрывает все остальные значения.
Задание
Напишите функцию number_printer(), которая принимает в качестве параметра одно число от 0 до 3 и выводит на экран его эквивалент на английском языке.
Например, для 2 она должна вывести на экран слово "Two". Если число меньше 0 или больше 3, то на экран должно вывестись само число без каких-либо преобразований. Ваша функция должна использовать switch для проверки числа.
C (Си): Switch вместо if/else
В этом уроке разберем, как заменить длинную цепочку if/else if/else на switch.
Для примера возьмем функцию charcode(), которая получает символ и возвращает код:
- Для символа
'a'функция возвращает0. - Для символа
'b'функция возвращает1. - Для любого другого символа функция возвращает
3.
Вариант через if else if else
int charcode(char c)
{
if (c == 'a')
return 0;
else if (c == 'b')
return 1;
else
return 3;
}Здесь важно:
- Для сравнения используем
==, а не=. - Оператор
=выполняет присваивание. - Оператор
!=означает "не равно".
Вариант через switch
int charcode(char c)
{
switch (c) {
case 'a':
return 0;
case 'b':
return 1;
default:
return 3;
}
}Ключевое слово case задает отдельные варианты, а default задает ветку для всех остальных значений.
Почему важен break
В switch есть важная особенность: если не поставить break, выполнение "проваливается" в следующий case.
Пример с ошибкой:
int charcode(char c)
{
int p;
switch (c) {
case 'a':
p = 0;
case 'b':
p = 1;
default:
p = 3;
}
return p;
}Если передать 'a', результатом все равно станет 3, потому что выполнятся все ветки подряд.
Правильный вариант:
int charcode(char c)
{
int p;
switch (c) {
case 'a':
p = 0;
break;
case 'b':
p = 1;
break;
default:
p = 3;
break;
}
return p;
}Теперь поведение корректное:
- Для символа
'a'функция возвращает0. - Для символа
'b'функция возвращает1. - Для любого другого символа функция возвращает
3.
Итоги
- Конструкция
switchудобна для выбора из нескольких конкретных значений. - Почти в каждом
caseнуженbreak, чтобы не было fallthrough. - Ветка
defaultпокрывает все остальные значения.
Задание
Напишите функцию number_printer(), которая принимает в качестве параметра одно число от 0 до 3 и выводит на экран его эквивалент на английском языке.
Например, для 2 она должна вывести на экран слово "Two". Если число меньше 0 или больше 3, то на экран должно вывестись само число без каких-либо преобразований. Ваша функция должна использовать switch для проверки числа.
Ваше упражнение проверяется по этим тестам
#include "greatest.h"
#include <unistd.h>
#include "main.c"
TEST test_base(int number, char *expected) {
int stdout_bk = dup(fileno(stdout));
int pipefd[2];
pipe(pipefd);
dup2(pipefd[1], fileno(stdout));
number_printer(number);
fflush(stdout);
close(pipefd[1]);
dup2(stdout_bk, fileno(stdout));
int buf_size = 10240;
char actual[buf_size];
read(pipefd[0], actual, buf_size);
ASSERT_STR_EQ(expected, actual);
memset(actual, 0, buf_size);
PASS();
}
GREATEST_MAIN_DEFS();
int main(int argc, char **argv) {
GREATEST_MAIN_BEGIN();
RUN_TESTp(test_base, 0, "Zero");
RUN_TESTp(test_base, 1, "One");
RUN_TESTp(test_base, 2, "Two");
RUN_TESTp(test_base, 3, "Three");
RUN_TESTp(test_base, 4, "4");
RUN_TESTp(test_base, 9, "9");
GREATEST_MAIN_END();
}Решение учителя откроется через:
20:00
