Следующая программа подсчитывает число символов; она
представляет собой небольшое развитие программы копирования.
MAIN() /* COUNT CHARACTERS IN INPUT */
{
LONG NC;
NC = 0;
WHILE (GETCHAR() != EOF )
++NC;
PRINTF("%1D\N", NC);
}
Оператор
++NC;
демонстрирует новую операцию, ++, которая означает увеличе-
ние на единицу. Вы могли бы написать NC = NC + 1 , но ++NC
более кратко и зачастую более эффективно. Имеется соответст-
вующая операция -- уменьшение на единицу. Операции ++ и --
могут быть либо префиксными (++NC), либо постфиксными
(NC++); эти две формы, как будет показано в главе 2, имеют в
выражениях различные значения, но как ++NC, так и NC++ уве-
личивают NC. Пока мы будем придерживаться префиксных опера-
ций.
Программа подсчета символов накапливает их количество в
переменной типа LONG, а не INT . На PDP-11 максимальное зна-
чение равно 32767, и если описать счетчик как INT , то он
будет переполняться даже при сравнительно малом файле ввода;
на языке "C" для HONEYWELL и IBM типы LONG и INT являются
синонимами и имеют значительно больший размер. Спецификация
преобразования %1D указывает PRINTF , что соответствующий
аргумент является целым типа LONG .
Чтобы справиться с еще большими числами, вы можете ис-
пользовать тип DOUBLE / FLOAT двойной длины/. мы также ис-
пользуем оператор FOR вместо WHILE с тем, чтобы проиллюстри-
ровать другой способ записи цикла.
MAIN() /* COUNT CHARACTERS IN INPUT */
{
DOUBLE NC;
FOR (NC = 0; GETCHAR() != EOF; ++NC)
;
PRINTF("%.0F\N", NC);
}
Функция PRINTF использует спецификацию %F как для FLOAT
, так и для DOUBLE ; спецификация %.0F подавляет печать не-
существующей дробной части.
Тело оператора цикла FOR здесь пусто, так как вся рабо-
та выполняется в проверочной и реинициализационной частях.
Но грамматические правила языка "C" требуют, чтобы оператор
FOR имел тело. Изолированная точка с запятой, соответствую-
шая пустому оператору, появляется здесь, чтобы удовлетворить
этому требованию. Мы выделили ее на отдельную строку, чтобы
сделать ее более заметной.
Прежде чем мы распростимся с программой подсчета симво-
лов, отметим, что если файл ввода не содержит никаких симво-
лов, то условие в WHILE или FOR не выполнится при самом пер-
вом обращении к GETCHAR , и, следовательно , программа вы-
даст нуль, т.е. Правильный ответ. это важное замечание. од-
ним из приятных свойств операторов WHILE и FOR является то,
что они проверяют условие в начале цикла, т.е. До выполнения
тела. Если делать ничего не надо, то ничего не будет сдела-
но, даже если это означает, что тело цикла никогда не будет
выполняться. программы должны действовать разумно, когда они
обращаются с файлами типа "никаких символов". Операторы
WHILE и FOR помогают обеспечить правильное поведение прог-
рамм при граничных значениях проверяемых условий.