C:无法理解以下数组赋值

Mid*_*lue 5 c arrays

问题说明了一切:

...
int ndigit[10];
...//fill in the array with 0s

while((c = getchar()) != EOF)
    if(c >= '0' && c <= '9')
         ++ndigit[c - '0']; //<== unable to understand this part
Run Code Online (Sandbox Code Playgroud)

据推测,该数组存储来自输入流的输入数字字符...

Pil*_*lsy 12

在C中,您可以使用字符代码对字符进行算术运算.因此,这确保您有一个数字,找出它是哪个数字(通过测量它与零的差异),然后增加数组中相应位置的计数.完成后,ndigit[0]将包含出现的次数'0',ndigit[1]将包含出现的次数'1',等等.


Abt*_*deh 8

它正在创建字符0-9的直方图."c-'0'"将getchar()中的值转换为整数,该整数充当数组的索引.该索引对应于数字0-9.然后它增加该阵列位置.因此,一旦完成运行,该数组包含字符0-9的重复.

因此0123456789应该生成所有的数组.0123333应该生成一个值为1114000000的数组.


GMa*_*ckG 6

字符0与数字0不同.

在ASCII中,字符"0"位于第48位.该标准保证在字符编码中,数字必须是连续的(我不知道标准在哪里说).也就是说,就像1在0之后,'1'将在'0'之后.因此,如果您输入'0',并且想要得到0,则从中减去'0'.'1'减去'0'将有1的差异.依此类推.