Одним из наиболее интересных аспектов использования цикла for является создание бесконечного цикла. Поскольку не требуется ни одна из частей, можно создать бесконечный цикл путём удаления части проверки условия. Например:
for( ; ; ) printf(“this loop will run forever.\n”);
while (выражение-условие)
тело цикла
Тело цикла – это или пустой, или простой, или составной оператор. Выражением-условием может быть любое выражение, имеющее в качестве истины ненулевое значение. Цикл выполняется, пока условие истинно. Когда условие становится ложным, выполняется строка, следующая за циклом.
Следующий пример показывает процедуру, обрабатывающую ввод с клавиатуры, работающую пока не будет введён символ ‘A’:
void wait_for_char(void)
{
char ch;
ch = ‘\0’;
while(ch!=’A’) ch = getchar();
}
Как и цикл for, цикл while сначала выполняет проверку, то есть тело цикла может вообще не выполняться.
Когда необходимо несколько различных условий для окончания цикла while, как правило, используют одну переменную, являющуюся результатом действия этих условий, причём значение этой переменной может устанавливаться в различных частях цикла. Например:
void func1(void)
{
int working = 1;
while(working) {
working = procces1();
if (working)
working = process2();
if (working)
working = process3();
}
}
Цикл do/whileпроверяет условие в конце. То есть, цикл do/whileвсегда выполняется, хотя бы один раз. Стандартный вид цикла do/whileследующий:
do{
последовательность операторов;
}while (выражение-условие);
Хотя в фигурных скобках нет необходимости при наличии одного оператора, они обычно используются для улучшения читабельности и устранения недоразумений (у читателя, а не у компилятора) по поводу цикла.
Возможно, наиболее типичным использованием цикла do/while является процедура выбора пунктов меню. Когда набран корректный ответ, она возвращает значение функции. Неправильный ответ приводит к повторному вводу.
Пример:
void menu(void)
{
char ch;
printf(“1. Check Spelling\n”);
printf(“2. Correct Spelling Errors\n”);
printf(“3. Display Spelling Errors\n”);
printf(“ Enter your choice: “);
do{
ch = getchar();
switch(ch) {
case ‘1’:
check_spelling();
break;
case ‘2’:
correct_errors();
break;
case ‘3’:
display_errors();
break;
}
} while(ch!=’1’&&ch!=’2’&&ch!=’3’);
}
Во всех циклах тело цикла не может быть описанием или определением. Это либо отдельный оператор, который всегда завершается точкой с запятой, либо составной оператор, либо блок (заключается в фигурные скобки).
Оператор break
Оператор break имеет два назначения. Первое – это окончание работы оператора switch. Второе – это принудительное окончание цикла, минуя стандартную проверку условия.
Когда оператор break встречается в теле цикла, цикл завершается и выполнение программы переходит на строку, следующую за циклом.
Пример
#include <stdio.h>
int main(void)
{
int x;
for(x=1; x<100; x++) {
printf(“%d ”,x);
if(x==10) break;
}
return 0;
}
Данная программа выводит числа от 0 до 10 включительно и заканчивает работу, поскольку break вызывает немедленный выход из цикла, минуя условие x<100.
Оператор continue
Работа оператора continue чем-то похоже на работу оператора break. Но вместо форсированного окончания continue переходит к следующей итерации цикла, пропуская оставшийся код тела цикла. Например, следующая процедура выводит только положительные числа:
do{
scanf(“%d”, &x);
if(x<0) continue;
printf(“%d “, x);
} while(x!=100);
Метки и goto
Хотя goto уже давно не рекомендуют использовать, он по-прежнему используется в программах. goto требует наличия меток для работы. Метка – это корректный идентификатор С, завершаемый двоеточием. Метка должна находиться в той же функции, что и goto.