Язык С

       

Подсчет символов


Следующая программа подсчитывает число символов; она представляет собой небольшое развитие программы копирования.

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 помогают обеспечить правильное поведение прог- рамм при граничных значениях проверяемых условий.



    Содержание раздела