我正在阅读 K&R 书,但我被数组卡住了(在简介中)。我不想在这里面提出更多问题,但这里的“一般问题”是我不明白如何使用数组,我觉得这本书在介绍时对它们的解释很差。 该程序计算数字(分别)、空格和其他。
#include <stdio.h>
int main(void)
{
int c, 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' && c <= '9')
{
++ndigit[c-'0'];
}
else if(c == ' ' || c == '\n' || c == '\t')
{
++nwhite;
}
else
{
++nother;
}
}
printf("digits =");
for(i = 0; i < 10; ++i)
{
printf(" %d", ndigit[i]);
}
printf(", blanks = %d, other = %d\n", nwhite, nother);
return 0;
}
我确实明白第一个“for”是将 ndigit[i]
的每个值设为 0。之后我就失去了它。它说“如果 i
等于 0 或 9,ndigit[c-'0']
是什么意思?”真的,那个'0'是什么。最后一部分是它用 i
做了另一个 'for',如果 i
在 ndigit 中,i
的值发生了什么变化?
我不应该问这个;这太新手了,但我不知道还能从哪里获得帮助。
最佳答案
数字'0'
.. '9'
的字符编码是连续的数字,通常是48 .. 57。如果c
在 '0'
到 '9'
范围内(if
测试已检查),然后是 ndigit[c-' 0']++
如果字符为 '0'
,则下标 0
增加计数,如果字符为 9
,则下标 9
字符是 '9'
,对于介于两者之间的值也是如此。 (请注意,您可以使用任何整数值表达式作为下标 - 但该值需要在数组的有效下标范围内,否则行为未定义 - C 中的一个专门术语,意思是“任何事情都可能发生,包括它可能按预期工作,或者使程序、计算机崩溃,或者……任何事情。)
C 要求 10 位数字具有连续的代码值,'0'
的编码低于 '1'
。请注意,电话过去会将 0 视为 10(很难发现 0 次点击,但在旋转电话时代却不难发现 10 次点击)。
关于c - 这个数组在每种情况下都在做什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28268606/