Kernighan 和 Ritchie 的主题 1.6
Topic 1.6 by Kernighan and Ritchie
我正在阅读 Kernighan 和 Ritchie 合着的书 "The C Programming language",我被困在了一个话题上。
主题编号 1.6 讨论数组。在书中,他们包含了一个计算数字、空格和其他字符的程序。程序是这样的:
#include <stdio.h>
main(){
int c,i,nother,nwhite;
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=='\t'||c=='\n')
++nwhite;
else
++nother;
printf("digits:");
for(i=0; i<10;++i)
printf(" %d",ndigit[i]);
printf(", white space = %d, other = %d\n", nwhite, nother);
}
首先,我不明白第一个 for 循环的目的是:
for(i=0;i<10;++i)
ndigit[i]=0;
其次,我无法理解这部分 while 循环背后的逻辑:
if (c>='0' && c<='9')
++ndigit[c-'0'];
我真的需要有人向我解释程序背后的逻辑,以便我可以进一步进行 C 编程。
感谢您的帮助!
ndigit[i]
保存数字 i
(0-9) 被计数的次数。例如,ndigit[5]
包含数字 5
被计数的次数。所以第一个循环只是将所有初始化为 0
,因为到目前为止什么都没有看到。
if语句检查当前字符c
是否为数字。如果是,它通过从中减去 '0'
来确定它是哪个数字。这将给出所需的索引,其中包含的值增加一个。
这个循环
for(i=0;i<10;++i)
ndigit[i]=0;
用于将数组ndigit
的所有元素都设置为0,数组将统计第几位数。
您可以在声明数组时将数组的所有元素初始初始化为 0,而不是此循环。
int ndigit[10] = { 0 };
至于这个说法
if (c>='0' && c<='9')
++ndigit[c-'0'];
然后如果输入的字符是数字 c>='0' && c<='9'
那么表达式 c-'0'
会给出数字的整数值。对应于计算机内存中字符常量 '0' - '9'
的字符,由它们的 ASCII 或其他一些编码方案代码表示。例如ASCII中的cgaracter'0'
有内码48
、字符'1'
-49
、字符'2'
-50
等。例如在 EBCDIC 中,cgaracter '0'
有另一个代码 240
,字符 '1'
- 241
等等。
C 标准保证所有数字相互跟随。
因此,如果变量 c
保留一些数字,则表达式 c - '0'
给出从 0(如果 c 保留 '0' )到 9(如果 c 保留字符 '9' )的数字。
此值(从 0 到 9)用作数组 ndigit
中的索引。
例如,假设 c 保留字符 '6'
。然后 c - '0'
将等于整数 6。因此 ndigit[6] 增加
++ndigit[c-'0']
索引为 6 的数组的这个元素计算输入字符“6”的次数。
我正在阅读 Kernighan 和 Ritchie 合着的书 "The C Programming language",我被困在了一个话题上。
主题编号 1.6 讨论数组。在书中,他们包含了一个计算数字、空格和其他字符的程序。程序是这样的:
#include <stdio.h>
main(){
int c,i,nother,nwhite;
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=='\t'||c=='\n')
++nwhite;
else
++nother;
printf("digits:");
for(i=0; i<10;++i)
printf(" %d",ndigit[i]);
printf(", white space = %d, other = %d\n", nwhite, nother);
}
首先,我不明白第一个 for 循环的目的是:
for(i=0;i<10;++i)
ndigit[i]=0;
其次,我无法理解这部分 while 循环背后的逻辑:
if (c>='0' && c<='9')
++ndigit[c-'0'];
我真的需要有人向我解释程序背后的逻辑,以便我可以进一步进行 C 编程。
感谢您的帮助!
ndigit[i]
保存数字 i
(0-9) 被计数的次数。例如,ndigit[5]
包含数字 5
被计数的次数。所以第一个循环只是将所有初始化为 0
,因为到目前为止什么都没有看到。
if语句检查当前字符c
是否为数字。如果是,它通过从中减去 '0'
来确定它是哪个数字。这将给出所需的索引,其中包含的值增加一个。
这个循环
for(i=0;i<10;++i)
ndigit[i]=0;
用于将数组ndigit
的所有元素都设置为0,数组将统计第几位数。
您可以在声明数组时将数组的所有元素初始初始化为 0,而不是此循环。
int ndigit[10] = { 0 };
至于这个说法
if (c>='0' && c<='9')
++ndigit[c-'0'];
然后如果输入的字符是数字 c>='0' && c<='9'
那么表达式 c-'0'
会给出数字的整数值。对应于计算机内存中字符常量 '0' - '9'
的字符,由它们的 ASCII 或其他一些编码方案代码表示。例如ASCII中的cgaracter'0'
有内码48
、字符'1'
-49
、字符'2'
-50
等。例如在 EBCDIC 中,cgaracter '0'
有另一个代码 240
,字符 '1'
- 241
等等。
C 标准保证所有数字相互跟随。
因此,如果变量 c
保留一些数字,则表达式 c - '0'
给出从 0(如果 c 保留 '0' )到 9(如果 c 保留字符 '9' )的数字。
此值(从 0 到 9)用作数组 ndigit
中的索引。
例如,假设 c 保留字符 '6'
。然后 c - '0'
将等于整数 6。因此 ndigit[6] 增加
++ndigit[c-'0']
索引为 6 的数组的这个元素计算输入字符“6”的次数。