Язык программирования Си для персонального компьютера
Шрифт:
Выполнение тела оператора-переключателя switch начинается с выбранного таким образом оператора и продолжается до конца тела или до тех пор, пока какой-либо оператор не передаст управление за пределы тела.
Оператор, следующий за ключевым словом default, выполняется, если ни одна из констант варианта не равна значению выражения переключения. Если же слово default опущено, то ни один оператор в теле переключателя не выполняется, и управление передается на оператор, следующий за переключателем в программе.
Выражение переключения должно иметь целочисленный тип. В версии 4 СП MSC этот
Синтаксически конструкции case и default являются метками (однако, на них нельзя передать управление по оператору goto). Метки case и default существенны только при начальной проверке, когда выбирается оператор для выполнения в теле переключателя. Все операторы тела, следующие за выбранным, выполняются последовательно, как бы "не замечая" меток case и default, если только какой-либо из операторов не передаст управление за пределы тела оператора switch. Для выхода из тела переключателя обычно используется оператор разрыва break. Одна из распространенных ошибок состоит в том, что программисты забывают разделять альтернативные операторы в теле переключателя операторами break.
В заголовок составного оператора, формирующего тело оператора switch, можно помещать объявления (см. раздел 5.3), но инициализаторы, включенные в объявления, не будут выполнены, поскольку при выполнении оператора switch управление непосредственно передается на выполняемый оператор внутри тела, обходя строки, которые содержат инициализацию.
Примеры:
/* пример 1 */
switch (с) {
case 'А': capa++;
case 'a': lettera++;
default: total++;
}
/* пример 2 */
switch (i) {
case -1: n++;
break;
case 0: z++;
break;
case 1: p++;
break;
}
/* пример 3 */
switch (i) {
case 1: if(a > 0) {
case 2: b = 3;
} else
case 3: k = 0;
}
В первом примере все три оператора в теле оператора switch выполняются, если значение с равно 'А'. Передача управления осуществляется на первый оператор (capa++;), далее операторы выполняются в порядке их следования в теле.
Если с равно 'а', те инкрементируются переменные lettera и total. Наконец, если с не равно 'А' или 'а', то инкрементируется только переменная total.
Во втором примере в теле оператора switch после каждого оператора следует оператор разрыва break, который осуществляет принудительный выход из тела оператора-переключателя switch. Если i равно – 1, переменная n инкрементируется. Оператор break, следующий за оператором n++, вызывает
В третьем примере при i, равном 1, будет выполнена следующая последовательность действий:
if(а > 0)
b = 3;
else
k = 0;
При i, равном 2, переменной b будет присвоено значение 3. При i, равном 3, переменная k будет обнулена.
Оператор в теле переключателя может быть помечен множественными метками case, как показано в следующем примере:
switch (с) {
case 'а':
case 'b':
case 'с':
case 'd':
case 'e':
case 'i': hexcvt(c);
}
В этом примере, если выражение переключения примет любое из значений 'а', 'b', 'с', 'd', 'e', 'i', будет вызвана функция hexcvt.
Оператор разрыва break
Синтаксис:
break;
Действие:
Оператор разрыва break прерывает выполнение операторов do, for, while или switch. Он может содержаться только в теле этих операторов. Управление передается оператору программы, следующему за прерванным. Появление оператора break вне операторов do, for, while, switch компилятор рассматривает как ошибку.
Если оператор разрыва break записан внутри вложенных операторов do, for, while, switch, то он завершает только непосредственно охватывающий его оператор do, for, while, switch. Если же требуется завершение более чем одного уровня вложенности, следует использовать операторы возврата return и перехода goto.
Пример:
for(i = 0; i < LENGTH; i++) {
for(j = 0; j < WIDTH; j++)
if(lines[i][j] == '\0') break;
lengths[i] = j;
}
В вышеприведенном примере построчно обрабатывается массив строк переменной длины lines. Именованная константа LENGTH задает количество строк в массиве LINES. Именованная константа WIDTH задает максимально допустимую длину строки. Задача состоит в заполнении массива lengths длинами всех строк массива lines. Оператор разрыва break прерывает выполнение внутреннего цикла for при обнаружении признака конца символьной строки ( \0'). После этого i-му элементу одномерного массива length [i] присваивается длина i-й строки в байтах. Управление передается внешнему оператору цикла for. Переменная i инкрементируется и процесс повторяется до тех пор, пока значение i не станет больше или равно значению константы LENGTH.