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

3.6. Цикл DO - WHILE

      Как уже отмечалось в главе 1, циклы WHILE и FOR обладают тем приятным свойством, что в них проверка окончания осуществляется в начале, а не в конце цикла. Третий оператор цикла языка "C", DO-WHILE, проверяет условие окончания в конце, после каждого прохода через тело цикла; тело цикла всегда выполняется по крайней мере один раз. Синтаксис этого оператора имеет вид:

 DO
    оператор
 WHILE (выражение)

Сначала выполняется оператор, затем вычисляется выражение. Если оно истинно, то оператор выполняется снова и т.д. Если выражение становится ложным, цикл заканчивается.
      Как и можно было ожидать, цикл DO-WHILE используется значительно реже, чем WHILE и FOR, составляя примерно пять процентов от всех циклов. Тем не менее, иногда он оказывается полезным, как, например, в следующей функции ITOA, которая преобразует число в символьную строку (обратная функции ATOI). Эта задача оказывается несколько более сложной, чем может показаться сначала. Дело в том, что простые методы выделения цифр генерируют их в неправильном порядке. Мы предпочли получить строку в обратном порядке, а затем обратить ее.

 ITOA(N,S)   /*CONVERT N TO CHARACTERS IN S */
 CHAR S[];
 INT N;
 {
 INT I, SIGN;
 
 IF ((SIGN = N) < 0)   /* RECORD SIGN */
    N = -N;     /* MAKE N POSITIVE */
 I = 0;
 DO {    /* GENERATE DIGITS IN REVERSE ORDER */
    S[I++] = N % 10 + '0';/* GET NEXT DIGIT */
 }   WHILE ((N /=10) > 0); /* DELETE IT */
 IF (SIGN < 0)
    S[I++] = '-'
 S[I] = '\0';
 REVERSE(S);
 }

Цикл DO-WHILE здесь необходим, или по крайней мере удобен, поскольку, каково бы ни было значение N, массив S должен содержать хотя бы один символ. Мы заключили в фигурные скобки один оператор, составляющий тело DO-WHILE, хотя это и не обязательно, для того, чтобы торопливый читатель не принял часть WHILE за начало оператора цикла WHILE.
      Упражнение 3-3.
      --------------
      При представлении чисел в двоичном дополнительном коде наш вариант ITOA не справляется с наибольшим отрицательным числом, т.е. Со значением N равным -2 в степени м-1, где м -- размер слова. Объясните почему. Измените программу так, чтобы она правильно печатала это значение на любой машине.
      Упражнение 3-4.
      --------------
      Напишите аналогичную функцию ITOB(N,S), которая преобразует целое без знака N в его двоичное символьное представление в S. Запрограммируйте функцию ITOH, которая преобразует целое в шестнадцатеричное представление.
      Упражнение 3-5.
      ---------------
      Напишите вариант ITOA, который имеет три, а не два аргумента. Третий аргумент -- минимальная ширина поля; преобразованное число должно, если это необходимо, дополняться слева пробелами, так чтобы оно имело достаточную ширину.

ПРЕДЫДУЩАЯ ЧАСТЬ
3.5. Циклы -- WHILE и FOR
СОДЕРЖАНИЕ СЛЕДУЮЩАЯ ЧАСТЬ
3.7. Оператор BREAK