15. Условный оператор множественного выбора switch. Безусловный переход.
Оператор switch позволяет провести анализ значения некоторого выражения и в зависимости от его значения выполнить те или иные действия. В общем случае формат записи оператора switch следующий:
switch (выражение выбора) {
case значение 1 : оператор 1;
break;
…
case значение n : оператор n;
break;
default : оператор;
В этой конструкции выражение выбора должно иметь порядковый тип — целый, перечислимый и т.д. Поэтому, например, нельзя использовать выражения, возвращающие действительные числа или строки.
Значения, указываемые в метках case, должны быть константными выражениями, соответствующими возможным значениям выражения выбора. После значения ставится двоеточие а затем пишется оператор (может писаться составной оператор), который должен выполняться, если выражение приняло указанное в метке значение.
Если значение выражения выбора совпало со значением, указанным в одной из меток case, то выполняется оператор, записанный после этой метки после чего, если не принять соответствующих мер, будут выполняться все последующие операторы остальных меток. Поскольку это обычно нежелательно, то, как правило, после оператора, который должен выполняться, записывают оператор
break;
Он прерывает выполнение структуры switch и управление передается следующему за ней оператору.
Если значение выражения выбора не соответствует ни одному из перечисленных в метках, то выполняется оператор, следующий за меткой default. Впрочем, метка default не обязательно должна включаться в структуру switch. В этом случае, если не нашлось соответствующего значения выражения выбора, то ни один оператор не будет выполнен.
Значения в метках могут содержать константы и константные выражения, которые совместимы по типу с объявленным выражением и которые компилятор может вычислить заранее, до выполнения программы. Недопустимо использование переменных и многих функций. В метках не допускается повторение одних и тех же значений, поскольку в этом случае выбор был бы неоднозначным.
Оператор передачи управления goto
Оператор goto позволяет прервать обычный поток управления и передать управление в произвольную точку кода, помеченную специальной меткой. В свое время при появлении концепции структурного программирования на оператор goto обрушился поток критики и его применение стало рассматриваться как дурной тон. Действительно, чрезмерно широкое применение goto делает структуру программы крайне запутанной и затрудняет ее сопровождение.
Однако во многих случаях стремление обойтись без оператора goto не только не упрощает код, а еще более его запутывает. Так что этот оператор, безусловно, имеет право на существование.
Метка в тексте программы обозначается идентификатором с последующим двоеточием. Например,
Lbegin:
Метка отмечает точку, в которую передается управление оператором goto. Метка может располагаться в любом месте блока, как после оператора goto, передающего на нее управление, так и до этого оператора. Надо только иметь в виду, что передача управления извне внутрь цикла может приводить к непредсказуемым последствиям, так что таких ситуаций следует избегать.
Метки имеет областью действия функцию. Метки можно использовать всюду в функции, в которой они появились, но на них нельзя ссылаться вне тела функции. Метки используются также в структурах switch.
После метки следует оператор, на который передается управление.
Сам оператор goto имеет форму:
goto метка;
Таким образом, организация работы с операторами goto может выглядеть, например, так:
goto L1;
second: ...
L1: ...
if (... ) goto L1;
else goto second;
При этом, как видно, можно ссылаться на метки, расположенные после или до оператора goto.