3.7. Оператор BREAK
Иногда бывает удобным иметь возможность управлять выходом из цикла иначе, чем проверкой условия в начале или в конце. Оператор BREAK позволяет выйти из операторов FOR, WHILE и DO до окончания цикла точно так же, как и из переключателя. Оператор BREAK приводит к немедленному выходу из самого внутреннего охватывающего его цикла (или переключателя).
Следующая программа удаляет хвостовые пробелы и табуляции из конца каждой строки файла ввода. Она использует оператор BREAK для выхода из цикла, когда найден крайний правый отличный от пробела и табуляции символ.
#DEFINE MAXLINE 1000 MAIN() /* REMOVE TRAILING BLANKS AND TABS */ { INT N; CHAR LINE[MAXLINE]; WHILE ((N = GETLINE(LINE,MAXLINE)) > 0) { WHILE (--N >= 0) IF (LINE[N] != ' ' && LINE[N] != '\T' && LINE[N] != '\N') BREAK; LINE[N+1] = '\0'; PRINTF("%S\N",LINE); } }
Функция GETLINE возвращает длину строки. Внутренний цикл начинается с последнего символа LINE (напомним, что --N уменьшает N до использования его значения) и движется в обратном направлении в поиске первого символа, который отличен от пробела, табуляции или новой строки. Цикл прерывается, когда либо найден такой символ, либо N становится отрицательным (т.е., когда просмотрена вся строка). Советуем вам убедиться, что такое поведение правильно и в том случае, когда строка состоит только из символов пустых промежутков.
В качестве альтернативы к BREAK можно ввести проверку в сам цикл:
WHILE ((N = GETLINE(LINE,MAXLINE)) > 0) { WHILE (--N >= 0 && (LINE[N] == ' ' \!\! LINE[N] == '\T' \!\! LINE[N] == '\N')) ; ... }
Это уступает предыдущему варианту, так как проверка становится труднее для понимания. Проверок, которые требуют переплетения &&, \!\!, ! и круглых скобок, по возможности следует избегать.
ПРЕДЫДУЩАЯ ЧАСТЬ 3.6. Цикл DO - WHILE |
СОДЕРЖАНИЕ | СЛЕДУЮЩАЯ ЧАСТЬ 3.8. Оператор CONTINUE |