Здравствуйте! Прошу помощи у тех, кто в силу своих знаний сможет мне, хеллоуволдщику, объяснить суть следующей конструкции цикла. Привожу выдержку из учебника:
А теперь напишем программу, подсчитывающую по отдельности каждую цифру, символы-разделители
(пробелы, табуляции и новые-строки) и все другие символы. Это несколько искусственная программа, но она
позволит нам в одном примере продемонстрировать еще несколько возможностей языка Си. Имеется
двенадцать категорий вводимых символов. Удобно все десять счетчиков цифр хранить в массиве, а не в виде
десяти отдельных переменных. Вот один из вариантов этой программы:
#include <stdio.h>
/* подсчет цифр, символов-разделителей и прочих символов */
main()
{
int с, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i = 0; i < 10; ++i)
ndigit[i]= 0;
while ((c = getchar()) != EOF)
if (c >= '0' && с <= '9' )
++ndigit[c - '0' ];
else if (c == ' ' || с == '\n' || с == '\t')
++nwhite;
else
++nother;
printf ("цифры =");
for (i=0; i < 10; ++i)
printf(" %d", ndigit[i]);
printf (", символы-разделители = %d, прочие = %d\n", nwhite, nother);
}
............
Приведенная программа опирается на определенные свойства кодировки цифр. Например, проверка
if (с >= '0' && с <= '9' ) ...определяет, является ли находящийся в c символ цифрой. Если это так, то
c - '0'
есть числовое значение цифры. Сказанное справедливо только в том случае, если для ряда значений '0' ,
'1',...,'9' каждое следующее значение на 1 больше предыдущего. К счастью, это правило соблюдается во
всех наборах символов.
Собственно, вопрос: что конкретно делает этот операнд:
++ndigit[c - '0' ];? Какое отношение эта, с первого взгляда, абсолютно не понятная операция имеет к кодировке? "Читаемый символ минус ноль"? Буду признателен любому ответу.
Спасибо всем, кто откликнется.