Прежде всего повторим снова текст программы:

#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

    Комментарии.


    Управление 1.
   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').


    Управление 2.
   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'.


    Управление 3.
   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 имеет значение истина, поэтому цикл завершается.