C 在每种情况下,此阵列都在做什么?
我正在读《K&R》这本书,我被数组卡住了(在介绍中)。我不想在这本书中提出更多的问题,但这里的“一般问题”是我不理解如何使用数组,我觉得这本书在介绍时对数组的解释非常糟糕。 此程序(单独)计算数字、空格和其他C 在每种情况下,此阵列都在做什么?,c,C,我正在读《K&R》这本书,我被数组卡住了(在介绍中)。我不想在这本书中提出更多的问题,但这里的“一般问题”是我不理解如何使用数组,我觉得这本书在介绍时对数组的解释非常糟糕。 此程序(单独)计算数字、空格和其他 #include <stdio.h> int main(void) { int c, i, nwhite, nother; int ndigit[10]; nwhite = nother = 0; for(i = 0; i < 10;
#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;
}
#包括
内部主(空)
{
int c,i,nwhite,other;
int-ndigit[10];
nwhite=nother=0;
对于(i=0;i<10;++i)
{
ndigit[i]=0;
}
而((c=getchar())!=EOF)
{
如果(c>='0'&&cc-'0'
将字符转换为整数:
- “0”成为整数0
- “1”变为1
因此,ndigit[c-'0']
指的是当前字符的计数器。数字的字符代码'0'
。'9'
是连续的数字,通常为48..57。如果c
在'0'
到'9'
的范围内(如果测试已选中该范围),则ndigit[c-'0']++
如果字符为'0'
,则递增下标0
的计数;如果字符为'9'
,则递增下标9
的计数;对于介于两者之间的值,则递增计数。(请注意,您可以使用任何整数值表达式作为下标-但该值必须在数组的有效下标范围内,或者行为未定义-这是C语言中的一个专门术语,表示“任何事情都可能发生,包括它可能按您的预期工作,或使程序或计算机崩溃,或…任何事情”。)
C要求10位数字具有连续的代码值,编码低于'1'
。请注意,电话过去将0视为10(很难发现0次点击,但在旋转电话时代不难发现10次点击)。在C中,每个字符都分配了一个值。您可以查找它们。
'0'的值为48,'9'的值为57
由于ndigit[c-'0']
中的c-'0'
需要是介于0和9之间的值,因此当c='0'
时,只需减去'0',c-'0'
等于0
当c=='9'
时,c-'0'
等于9
当c
介于'0'-'9'
之间时,可以对值进行插值
当c-'0'
等于0
时
++ndigit[c-'0'];
递增ndigit[0]
的值
当c-'0'
等于9
时
++ndigit[c-'0'];
递增ndigit[9]
的值
当c
介于'0'-'9'
之间时,您可以使用c-'0'
对发生的情况进行插值,您将从ASCII值中获取实数值
请看一看.Character'1'
,您可以使用getchar()
加载它,它的ascii值为49。如果您从中减去Character'0'
的值,您将得到实值1,因此开始while循环运行,直到您输入文件的结尾(在Windows上Ctrl+Z
;在Unix系统上Ctrl+D
)
在此之前,它每次读取1个字符。然后它通过if
语句检查它是数字(0-9
)还是新行(\n
)、空格([space here]
)、制表符(\t
)或其他内容
它增加(+1)特定变量或在特定数组索引处的数字。(这:c-'0'
是将字符转换为int,因此您可以访问数组并增加特定值,前提是您已使用0初始化数组。)
最后,它会打印您输入的字符/数字。在计算机内存中,所有字符都用整数表示,即它们的代码
在C程序中,'0'
(achar
literal)根据所使用的编码,本质上是字符0的整数值(code)。
在现代系统中,字符0的代码是48,字符1的代码是49,等等。所以,'0'==48
,'1'==49
等等
在这个程序中,一个字符数字(即一个数字的代码)被转换成该数字的数值,因此ndigits[0]
将计数为零,ndigits[1]
将计数1等。c-“0”
使用数字编码密集且编码表中的数字有序的事实执行此转换
c | c - '0'
----+--------------------------
'0' | '0' - '0' = 48 - 48 = 0
'1' | '1' - '0' = 49 - 48 = 1 (Code of '1' is 49.)
'2' | '2' - '0' = 50 - 48 = 2 (Code of '2' is 50.)
...
'9' | '9' - '0' = 57 - 48 = 9
ndigits[i]
表示i
-数组的第项ndigits
。例如,当i
为0时,ndigits[i]
=ndigits[0]
=第一项(索引从0开始)数组项。了解代码如何工作的一个好方法是在调试器中运行它,单步执行代码并观察变量如何变化。嗨,Paul,我对你的评论很感兴趣,我使用的是code::Blocks,我不太了解如何在debug中运行它。我不熟悉code::Blocks,但几乎不了解任何resPropectable IDE应该让你做基本的源代码级调试。它有手册吗?呃,我回答得太晚了,我真的不知道它是否有手册,你看我开始编程时非常粗糙,首先是兴趣,然后我才开始编写我学到的东西,如果你知道一个优秀的IDE,告诉我,我确实喜欢Code::Blocks但我见过使用Dev-C++和其他一些人,我只是熟悉Code::Blocks,所以你的建议会很有用。对不起,我不是Windows用户,所以我不知道向初学者推荐什么。我知道你可以从Microsoft thoug获得Visual Studio的免费版本