我正在阅读Kernighan& amp;的'C编程语言'。里奇和我正在努力弄清楚线路的作用。我想我只是有点愚蠢,并不太了解他们的解释。
++ndigit[c-'0'];
我必须稍微更改程序,因为ndigit
之前给了我垃圾值,所以我只是将数组实例化为0,而不是使用for循环遍历它,并更改值方式。
#include <stdio.h>
main()
{
int c, i, nwhite, nother;
int ndigit[10]= {0};
nwhite = nother = 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 (", white space = %d, other = %d\n", nwhite, nother);
}
使用该程序作为输入,我们将其打印到控制台 -
digits = 7 2 0 0 0 0 0 0 0 1, white space = 104, other = 291
我知道7 2 0 0 0 0 0 0 0 1
是输入0中出现的单个数字出现次数的次数是7次,1次出现两次等等。)
但是,...[c-'0'];
'如何运作?
答案 0 :(得分:4)
您询问以下表达式的工作原理
c-'0'
输入的字符的ASCII码从ASCII码0中减去,它定义了数组中必须存储计数的位置。
假设您从键盘输入 1 1 的ASCII代码为49, 0 的ASCII代码为48。 因此
49-48 =1
并且计数将存储在数组索引位置1中。
答案 1 :(得分:3)
c-'0'
是将int值==赋予char数的技术,例如1
为'1'
,5
为'5'
。
字符符号'0', '1', '2' ..... '9'
被分配了继续编码值,因此数字字符常量与'0'
的差异给出了十进制数。 (在您的编译器中,例如在ASCII char中,它们被分配了连续的acsii值)。
例如,变量c
中的'7'
是c - '0'
,然后7
== int ndigit[10]= {0};
// default initialized with `0`
;
在声明为:
的代码数组中0
因此索引可以从9
到++ndigit[c-'0']; // ndigit[c-'0'] = ndigit[c-'0'] + 1;
。所以你的代码:
1
在数字char的相应位数处将数字的频率增加{{1}}。
答案 2 :(得分:3)
在C中,当你有一个char类型的变量c
时,它实际上存储了char的一些整数编码(通常是ASCII代码)。因此c-'0'
表示c
中包含的字符代码与字符0
的差异。由于数字是自然顺序,因此它会转换相关数字中的数字。
答案 3 :(得分:2)
C标准要求字符'0'到'9'具有连续值。
'0'
表示零值作为字符,c表示您输入的值计算如下:
'1' - '0'== 1
'2' - '0'== 2
等等......如果c
是数字
c
的值
答案 4 :(得分:2)
Ascii是一种编码,它为连续的数字提供连续的id。正如Eric Postpischil指出的那样,标准要求属性,即使底层编码不需要ascii。 Ascii虽然很常见。
char c1 = '0';
char c2 = '1';
因此,无论'0'
被映射到哪个数字,'1'
都将是该数字+ 1.本质上:
c2 == c1 + 1
从作为数字的字符中减去'0'
,将返回其数值:
'1' - '0' == 1
答案 5 :(得分:1)
以ASCII wikipedia加载。
美国信息交换标准码(ASCII /æski/ ass-kee)1是一种字符编码方案,最初基于英文字母编码128个指定字符 - 数字0-9,字母az和AZ,一些基本的标点符号,一些源自Teletype机器的控制代码,以及一个空格 - 进入7位二进制整数。
所以在ASCII方案中,'0'字符是数字48,字符'1'是41,依此类推。因此c - '0'相当于c - 48.如果c为'1',则表达式变为49 - 48 = 1.因此在少数单词'c' - '0'中转换一个数字char ['0' - '9 ']为整数[0-9]。
编辑1 正如@Eric Postpischil所建议的,ASCII不是ANSi C(也不是c ++)的一部分。但是很常见,我知道的所有编译器都使用ASCII集。
答案 6 :(得分:1)
((c = getchar()) != EOF)
if (c >= '0' && c <= '9')
++ndigit[c-'0'];
c
为您提供当前角色。通过范围检查,您确认它是一个数字by using its ASCII value
检查chr
的{{1}}列,0
,48
8
。56
'8'- '0'
56 - 48
}} = 8
ndigit
用于跟踪数字出现的次数,其中数组的每个元素表示其下标发生的次数。
ndigit[0]
会给您0
发生的次数等等ndigit[x]
x
给出[c - '0']
出现的次数
c
假设您的8
,即当前字符为'8' - '0'
,则8
将为您提供ndigit[8]
。所以你得到++
和0
这个值[你在开始时将它初始化为{{1}}]
答案 7 :(得分:0)
'0'是一个char,它的值为48.您可以在google中查找任何ASCII表。 它以这种方式工作,因为你从输入字符值读取而不是int,所以如果你不添加“-'0”部分,它将增加数组的第48个单元格。 而不是“-'0”,你可以放“-48”,在我看来,这种方式更具可读性。