Я бы ответил вопросом: почему вы используете оператор switch, а не если ... еще если?
Удивительно, но многие программисты никогда не задают этот вопрос, но относятся к switch
для чего-то фундаментального, что должно быть в языке.Это неправда!Вы можете написать любую программу на C, даже не используя switch
.Строго говоря, switch
является избыточной функцией.
Так зачем ее использовать?
Читаемость не причина, почему.switch
на самом деле имеет гораздо худший и менее интуитивный синтаксис, чем if-else.Необходимость операторов break внутри коммутатора, странных синтаксических правил коммутатора, позволяющих объявлять регистр внутри локальной области другого регистра, произвольного расположения по умолчанию.
switch
не только менее читабелен, но и намного более подвержен ошибкам, чем if-else.Забытый разрыв - самая очевидная опасность, которая привела к миллионам и миллионам труднодоступных ошибок в программном обеспечении.
Еще один более очевидный аргумент против того, чтобы switch
был более читабельным, - это «голый» код:
if (A)
{
}
else if (B)
{
}
else if (C)
{
}
else
{
}
switch(something)
{
case A:
{
break;
}
case B:
{
break;
}
case C:
{
break;
}
default:
{
break;
}
}
If и переключатель выше эквивалентны по синтаксису и функции и должны быть скомпилированы в тот же машинный код.Вот статистика из этого примера.
if-else switch
Symbols 33 65 // Not counting the expressions
Lines 12 19 // Not counting empty lines
требует больше кода для того же результата, поэтому должно считаться менее читаемым, чем if-else.
Прежде чем вы начнете спорить о переключателе, который больше похож на таблицу, чем если-либо, это все о форматировании кода и не имеет значения.Ничто в стандарте не мешает вам писать такой код:
if (A) {}
else if (B) {}
else if (C) {}
else {}
switch(something)
{
case A: { break; }
case B: { break; }
case C: { break; }
default: { break; }
}
Я бы посчитал любую форму читабельной, если вы хотите какой-то минимальный табличный синтаксис.
ТамКонечно, это могут быть эстетические, суеверные или религиозные причины, по которым switch
следует использовать для удобства чтения, но я скорее оставляю такие не по теме обсуждения на сайтах, не связанных с программированием.
Так что переключение менее безопаснои менее читабельный, чем если-еще.То, что затем остается привлекательным для программиста, - это эффективность.Программист с n кейсами, которые должны быть проверены программой, наверняка хотел бы иметь что-то, что делает поиск правильного кейса максимально быстрым.Это плохая идея, чтобы рассматривать все случаи в линейной форме.
Как вы, возможно, знаете, можно оптимизировать if-else или довольно много переключать, реализуя его в виде массива указателей функций:
typedef void (*Func_t)(void);
const Func_t cases [N] = { ... };
cases[i]();
Эта радикальная оптимизация частоименно то, что делает компилятор, когда сталкивается с оператором switch.Однако эта оптимизация может быть выполнена, только если все случаи являются смежными целыми числами.Если они не являются смежными, то смежность может быть создана с помощью таблицы поиска const.
Но если случаи не целочисленного типа, описанная выше оптимизация не может быть выполнена.Если бы они были числами с плавающей точкой, строками или чем-то еще, разумного способа оптимизировать код не было бы.
Так что, по крайней мере, в моей книге, switch
существует только для этой цели: это облегчает компиляторусоздать более эффективный код, чем if-else.Таким образом, он попадает в ту же категорию, что и встроенные ключевые слова, регистр и т. Д., Что также облегчает компилятору оптимизацию вашего кода.