Операторы переходов
Оператор break
Этот оператор имеет два назначения. Первое – это окончание работы оператора switch. Второе – это принудительное окончание цикла, минуя стандартную проверку условия. Первое назначение подробно рассмотрено выше в этой главе. Здесь же мы рассмотрим второе назначение оператора break.
Когда оператор break встречается в теле цикла, цикл немедленно заканчивается и выполнение программы переходит на строку, следующую за циклом. Например:
#include <stdio.h>
int main(void)
{
int t;
for(t=0; t<100; t++) {
printf(“%d “, t);
if(t==10) break;
}
return 0;
}
Данная программа выводит на экран числа от 1 до 10 включительно и заканчивает работу, поскольку break вызывает немедленный выход из цикла, минуя условие t<100.
Оператор break, как правило, используется в циклах, где особые условия могут вызвать немедленное завершение работы. Ниже приведен пример того, как нажатие на клавишу может остановить выполнение функции look_up():
int look_up(char *name)
{
char tname[40];
int loc;
loc = -1;
do {
loc = read_next_name(tname);
if(kbhit()) break;
} while(!strcmp(tname, name));
return loc;
}
Такие функции можно использовать для поиска имени в файле базы данных. Если файл слишком длинный и надоело ждать, то можно нажать на любую клавишу и выйти из функции до окончания работы. Стандартная функция kbhit() возвращает 0, если не было нажатия клавиши. В противном случае она возвращает ненулевое значение.
break вызывает выход из самого внутреннего цикла. Например:
for(t=0; t<100; t++) {
count = 1;
for(;;) {
printf(“%d “, count);
count++;
if(count == 10) break;
}
}
выводит числа от 1 до 10 включительно 100 раз. Каждый раз, когда встречается break, контроль передается внешнему циклу for.
break, используемый в операторе switch, влияет только на данный switch, но не на цикл, в котором может находится данный switch.
Оператор continue
Работа оператора continue чем-то похожа на работу оператора break. Но вместо форсирования окончания цикла continue переходит к следующей итерации цикла, пропуская оставшийся код тела цикла. Например, следующая процедура выводит только положительные числа:
do {
scanf(“%d”, &x);
if(x<0) continue;
printf(“%d “, x);
} while(x!=100);
В циклах while и do/while оператор continue вызывает переход к проверке условия и затем продолжает работу цикла. В случае цикла for выполняется часть увеличения, затем проверяется условие и, наконец, выполняется само тело цикла. Предыдущий пример может быть изменен для вывода только 100 положительных чисел следующим образом:
for(t=0; t<100; t++) {
scanf(“%d”, &x);
if(x<0) continue;
printf(“%d “, x);
}
В следующем примере оператор continue используется для ускорения выхода из цикла путем форсирования проверки, выполненной ранее:
void code(void)
{
char done, ch;
while (!done) {
ch = getchar();
if(ch == ‘.’) {
done = 1;
continue;
}
putchar(ch+1); /* сдвиг алфавита на одну позицию */
}
}
Можно использовать данную функцию для кодирования сообщений, сдвигая все символы на 1 вверх, т. е. ‘a’ станет ‘b’. Функция завершает работу при обнаружении символа «точка» и вывода на экран символа «точка» не происходит, поскольку благодаря continue выполнение, минуя оператор вывода, переходит к условию проверки, которое обнаруживает, что done истинно, и вызывает выход.
Функция exit()
Функция exit(), находящаяся в стандартной библиотеке, вызывает немедленное окончание работы программы. Поскольку функция exit() останавливает выполнение программы и форсирует возврат в операционную систему, она используется для управления устройствами, и ее используют подавляющее большинство программ. Функция exit() имеет следующий вид:
void exit(int статус);
Она использует заголовочный файл stdlib.h. Значение статуса возвращается в операционную систему.
Для индикации корректности завершения работы exit() традиционно вызывается с аргументом 0. Другие аргументы используются для индикации различного рода ошибок. Можно также использовать предопределенные макросы EXIT_SUCCESS (успешное завершение) и EXIT_FAILURE (завершение с ошибками) в качестве значений для статуса.
exit() используется, когда условия выполнения программы неудовлетворительны. Например, компьютерная игра может требовать специальный графический адаптер. Функция main() данной игры может выглядеть следующим образом:
#include <stdlib.h>
int main(void)
{
if(!special_adapter()) exit(1);
play();
return 0;
}
где special_adapter() – это определенная пользователем функция, возвращающая истину, если необходимый адаптер присутствует. Если такового в системе нет, то данная функция возвращает ложь и программа завершает работу.
В другом примере exit() используется для выхода из программы и возврата в операционную систему:
void menu(void)
{
char ch;
printf(“1. Проверка орфографии\n”);
printf(“2. Корректировка ошибок орфографии\n”);
printf(“3. Вывод ошибок на экран\n”);
printf(“4. Выход из программы\n”);
printf(“Выбери режим: “);
do {
ch = getche(); /* чтение клавиатуры */
switch(ch) {
case ‘1’:
check_spelling();
break;
case ‘2’:
correct_errors();
break;
case ‘3’:
display_errors();
break;
case ‘4’:
exit(0); /* возврат в ОС */
}
} while(ch!=’1’ && ch!=’2’ && ch!=’3’);
}
