我终于开始阅读 K& R 了,我刚刚到达数组部分。 但是在本节的例子中,有一段我完全不了解的代码,所以我想请你清楚地解释它,因为我想了解每一个概念。 C,因为我知道它是快速学习C ++的基础。
顺便说一句,我已经对JAVA有了不错的了解,希望这对你的解释设置有所帮助。
问题:
在这段代码中ndigit[c - '0']
我不明白它要做什么,我从其他Stack Overlfow的问题中得知0应该引用 ASCI 标准,应该 48 ,但仍然不了解c和0之间的关系。
答案 0 :(得分:2)
简答:
通过 ndigit[c-'0']
,您没有在进行正常的算术运算,例如 [5+5] = [10]。相反,您首先将字符转换为字符代码。然后用字符代码进行算术运算。
简单地说-我们用这个“5”符号用英语代表五个。其他语言有自己的五符号,即五在日语中是五。同样计算机用 53 表示 5(假设 ascii,ascii 就像一种语言)。所以对于ndigit[c-'0']
,它首先被转换为字符代码,然后进行算术运算。
长答案:
让我们先通过ndigit[c - '0']
。
ndigit
= 数组名称
[ ]
= 索引,用于指定总元素数。
c - '0'
= 算术运算。 c
是一个变量。 -
是减号。而且
'0'
不是 0,而是 48。
现在让我从书中添加额外的代码 -
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
这里需要注意的是 getchar()
。 getchar() 返回 int 类型的数据。即使它返回 int 类型,但它不会返回字符,而是返回字符代码。让我举个例子-
#include <stdio.h>
int main(){
int c;
c = getchar();
printf("%d\n", c);
}
输出:
@mix:~
$ cc test.c
@mix:~
$ ./a.out
5 ;wrote 5 in terminal
53 ; printed 53 instead of 5
5 是字符。而53是5的字符代码。
现在让我们回到我们的主要话题 ndigit[c - '0']
。 c 正在从 getchar()
获取值。和 getchar() 从输入中读取。假设 input 是 5 。现在由于 getchar() 函数的行为而不是 5,c 将包含 53。所以
ndigit[c - '0'] == `ndigit[53 - '0']` != `ndigit[5 - '0']`
还要注意我们没有使用 0,而是使用 '0'。 意味着算术 -
ndigit[53 - '0']
=ndigit[53] ;**wrong**
使用 '0'
意味着我们打算使用字符代码(使用单引号)。如上所述'0' = 48
(根据ascii)。所以
ndigit[53 - '0']
= ndigit[53 - 48]
= ndigit[5]
现在我们找回了 getchar()
读取的字符。但是我们为什么要找回我们的性格呢? ndigit[c]
可以代替 ndigit[c - '0']
吗?
ndigit[c]
不会工作,因为在我们的代码开始时我们写了 ndigit[10]
。我们的 ndigit[10]
数组最多可容纳 10 个元素。结果 c
不能大于 10 或 ndigit[53]
无效,因为它的大小是 53 并且超过 10 。这就是为什么我们使用 ndigit[c - '0']
进行字符代码减法并得到小于 10 的值。
如果还不清楚,搜索并了解以下内容-
答案 1 :(得分:1)
在此代码中,char
是char
,可能代表一个数字。在C中,'0'
是一个整数类型,因此您可以对它们执行算术运算。
数字使用连续范围内的数字进行编码:如果k
的代码为'1'
,则k+1
的代码为'2'
,代码为{{1}是} k+2
,依此类推。这就是为什么从表示数字的字符中减去'0'
得到该数字的数值。
例如,通过减去'5'-'0'
,您会得到一个数字5
而不是字符'5'
。
如果创建数组ndigit[10]
,则ndigit[c - '0']
允许您访问与数字对应的数组元素。例如,这可用于计算输入中不同数字的数量。
答案 2 :(得分:0)
正如您所说'0'
等于48
(假设是ASCII编码)。因此,其他数字分别等于49
到57
。因此'1'
等于49
,'2'
到50
等。因此'1' - '0'
等于'49 - 48'
,即1
并且'2' - '0'
等于'50 - 48'
,即2
,依此类推。
换句话说,c - '0'
会将'5'
之类的数字转换为等效的整数(5
为'5'
)。