основыкнигиwin/dos*nixготовоелирикагостиФОРУМПОИСК
Б.В. Керниган, Д.М. Ричи -- Язык C

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