Наступна програма лічить символи; вона подібна до попередньої програми копіювання.
#include <stdio.h>
/* лічить символи вводу; 1-а версія */
main()
{
long nc;
nc = 0;
while (getchar() != EOF)
++nc;
printf("%ld\n", nc);
}
Вираз
++nc;
знайомить нас з новим оператором, ++, який означає «збільшити на одиницю». Ви могли би натомість написати nc = nc + 1, але ++nc стисліший і, часто, ефективніший. Існує також відповідний оператор -- для зменшення на одиницю. Оператори ++ й -- можуть бути префіксними (++nc) та постфіксними (nc++); ці дві форми мають різне значення у виразах, як буде показано в Розділі 2, але ++nc й nc++, обидва, збільшують nc на один. Для наших цілей, ми зупинимось на префіксній формі.
Програма відліку знаків зберігає кількість знаків у змінній типу long замість int. Довгі цілі мають, щонайменше, 32-бітну довжину. Хоч на деяких машинах int та long однакової довжини, на інших int має лише 16 біт, з максимальним значенням 32767, і потрібно дуже мало вводу, щоб переповнити int-лічильник. Вказівник перетворення %ld вказує printf, що відповідний аргумент є довгим цілим.
Ми можемо упоратись і з більшими числами, застосувавши тип double (число з рухомою точкою подвійної точності). Ми також використаємо твердження for замість while, для демонстрації іншого способу написання циклу.
#include <stdio.h>
/* лічить символи вводу; 2-а версія */
main()
{
double nc;
for (nc = 0; gechar() != EOF; ++nc)
;
printf("%.0f\n", nc);
}
printf використовує %f для обох типів, float і double; %.0f пригнічує вивід десяткової крапки та дробової частини, яку ми вказали як нуль.
Корпус цього циклу порожній, оскільки вся робота вже зроблена у тестовій та інкрементній частині циклу. Але граматичні правила C вимагають, щоб твердження for мало корпус. Поодинока крапка з комою, яку називають «нульовим твердженням» знаходиться там для того, щоб задовольнити це правило. Ми розмістили її на окремому рядку, щоб вона була помітною.
Перед тим як ми покинемо програму-лічильник, зверніть увагу, що якщо ввід не містить жодних знаків, тести while або for зазнають невдачі при першому ж викликові getchar і програма виведе нуль — правильне значення. Це важливо. Однією з гарних рис while або for є те, що вони здійснюють перевірку на вершечку циклу, до переходу до виконання самого корпусу. Якщо робити нічого не треба, нічого й не буде зроблено, навіть якщо це означає не входити жодного разу в корпус циклу. Програми мають поводитись розумно, коли їм надано ввід нульової довжини. Твердження while та for допомагають упевнитися, що програми здійснюють розумні речі з граничними умовами.