Прежде всего повторим снова текст программы:
#include <stdio.h> #define print3(x1,x2,x3) printf("%d %d %d\n",x1,x2,x3) #define ENUF 3 #define EOS '\0' #define NEXT(i) input[i++] #define FALSE 0 #define TRUE 1 char input[]="PI=3.14159, approximately"; void main () { char c; int done,high,i,in,low; /* ----------------- */ i = low=in=high=0; while (c=NEXT(i)!=EOS) if (c<'0') low++; else if (c>'9') high++; else in++; print3 (low,in,high); /* Управление 1 */ i = low=in=high=0; done = FALSE; while ((c=NEXT(i))!=EOS && !done) if (c<'0') low++; else if (c>'9') high++; else in++; if (low>=ENUF||high>=ENUF|| in>=ENUF) done = TRUE; print3 (low,in,high); /* Управление 2 */ i = low=in=high=0; done = FALSE; while ((c=NEXT(i))!=EOS && !done) if (c<'0') done = (++low==ENUF); else if (c>'9') done = (++high==ENUF); else done = (++in==ENUF); print3 (low,in,high); /* Управление 3 */ }
Результаты работы программы:
25 0 0 3 6 16 0 0 3
Комментарии.
i = in=high=low=0;
input[]="PI=3.14159, approximately";
while (c=NEXT(i)!=EOS)
{
...
}
Условие продолжения цикла заключается в том, что NEXT(i)!=EOS, где NEXT(i) последовательно принимает значения символов из строки input. Переменная c принимает значение логического выражения NEXT(i)!=EOS, которое по определению равно истина в цикле и ложь при выходе из цикла.
if (1<'0')
low++;
Так как в цикле c всегда имеет значение 1, то low всегда будет увеличиваться (1<48).
Цикл продолжается до тех пор, пока не будут прочитаны все символы из input. В качестве символа конца строки в языке C++ используется нулевой символ "алфавита" ASCII ('\0').
i = in=high=low=0;
done = FALSE;
input[]="PI=3.14159, approximately";
while ((c=NEXT(i))!=EOS && !done)
{
...
}
Переменная c последовательно принимает значения символов из input.
if ('P'< '0')
При первом выполнении цикла значение переменной c равно 'P', следовательно, в условном операторе условие - ложь.
else if ('P' >'9') ('P' >'9') - "истина", и high увеличивается на 1. while ('I'!=EOS && !done)
Возвращаемся к условию продолжения цикла.
Условный оператор, сравнивающий low, high и in с ENUF, находится вне тела цикла, хотя и кажется, что он в него входит. Так как done в теле не изменяется, то цикл завершится, когда c станет равно EOS. В цикле счетчики low, in и high увеличиваются в зависимости от результата сравнения с символами '0' и'9'.
i = in=high=low=0;
done = FALSE;
input[]="PI=3.14159, approximately";
while ((c=NEXT(i))!=EOS && !done)
Переменная c последовательно принимает значения символов из стринга input.
if ('P' < '0') "Ложь". else if ('P' > '9') "Истина". done = (++high==ENUF)
Переменная high после увеличения не равна ENUF, поэтому переменной done присваивается значение ЛОЖЬ.
while ('I'!=EOS && !done) "Истина". if ('I'< '0') "Ложь". else if ('I' > '9') "Истина". done=(++high==ENUF) "Ложь". while ('='!=EOS && !done) "Истина". if ('='< '0') "Ложь". else if ('=' > '9') "Истина". done = (++high==ENUF) "Истина". while ('3'!=EOS && !done)
done имеет значение истина, поэтому цикл завершается.