Листинг 7.9. Программа skippart.c

Управляющие операторы С: ветвление и переходы 273

В листинге 7.9 цикл while читает входные данные до тех пор, пока не будет введено нечисловое значение. Оператор if внутри цикла отсеивает недопустимые значения результатов. Если вы, скажем, вводите число 188, программа сообщает о том, что оно является недопустимым. Затем оператор continue заставляет программу пропустить оставшуюся часть цикла, которая предназначена для обработки допустимого входного значения. Взамен программа начинает новую итерацию, считывая очередное входное значение.
Следует отметить, что избежать применения оператора continue можно двумя путями. Один из них предполагает устранение оператора continue и заключение оставшейся части итерации в блок else:
if (score < 0 || score > 100)
/* оператор printf() */
else
{
/* операторы */
}
В качестве альтернативы можно было бы воспользоваться следующим форматом:
if (score >= 0 && score <= 100)
{
/* операторы */
}
274 Глава 7
Преимущество использования continue в этом случае связано с возможностью устранения одного уровня отступа в главной группе операторов. Краткая форма способствует читабельности в ситуации, когда иначе операторы получаются громоздкими и глубоко вложенными.
Оператор continue может также применяться как заполнитель. Например, в следующем цикле читаются и отбрасываются вводимые символы, включая конец строки:
while (getchar() != '\n')
Такой прием удобен, когда программа уже прочитала некоторые символы в строке и ей необходимо пропустить оставшиеся символы до начала следующей строки. Проблема этого кода в том, что одиночный символ точки с запятой трудно заметать. Код станет более читабельным, если воспользоваться оператором continue:
while (getchar() != '\n') continue;
He применяйте оператор continue, если он вместо упрощения усложняет код. Взгляните на следующий фрагмент:
while ((ch = getchar()) != '\n')
{
if (ch = ‘\t') continue; putchar(ch);
}
В этом цикле пропускаются символы табуляции, а сам цикл завершается, только когда встретится символ новой строки. Такой цикл можно выразить более экономно:
while ((ch = getchar()) != '\n ') if (ch != ‘\t') putchar(ch);
Часто, как и в данном случае, обращение проверки в if устраняет потребность в
continue.
Вы уже видели, что оператор continue приводит к пропуску оставшейся части тела цикла. Где в точности возобновляется выполнение цикла? В случае while и do while следующим действием после continue будет вычисление условия проверки цикла. Рассмотрим для примера следующий цикл:
count = 0;
while (count < 10)
{
ch = getchar(); if (ch = ‘\n') continue; putchar(ch); count++;
}
Цикл считывает 10 символов (исключая символы новой строки, т.к. оператор count++; пропускается, когда значением ch является символ новой строки) и выводит их на экран кроме символа новой строки. После выполнения оператора continue следующим вычисляется проверочное выражение цикла.
В цикле for следующим действием будет вычисление обновляющего выражения и затем проверочного выражения цикла. Взгляните на показанный ниже пример цикла:
Управляющие операторы С: ветвление и переходы 275
for (count = 0; count < 10; count++)
{
ch = getchar(); if (ch == ‘\n ') continue; putchar(ch);
}
В этом случае после выполнения оператора continue переменная count сначала инкрементируется, а затем сравнивается со значением 10. Следовательно, данный цикл ведет себя несколько иначе цикла while в рассмотренном выше примере. Как и ранее, отображаются только символы, отличные от символа новой строки. Однако на этот раз при подсчете учитываются символы новой строки, так что цикл читает ровно 10 символов, включая символы новой строки.
Оператор break
Оператор break в цикле заставляет программу прервать цикл и перейти к выполнению следующего оператора. В листинге 7.9 замена continue оператором break приводит к выходу из цикла при вводе, скажем, числа 188, а не к пропуску оставшихся операторов внутри цикла и переходу к следующей итерации. На рис. 7.3 приведено сравнение операторов break и continue. Если оператор break находится внутри вложенных циклов, его действие распространяется только на самый внутренний цикл, в котором он содержится.

Рис. 7.3. Сравнение операторов break u continue
Читать дальше