清楚解释ndigit [c - ' 0']

时间:2016-03-19 22:34:51

标签: c arrays

我终于开始阅读 K& R 了,我刚刚到达数组部分。 但是在本节的例子中,有一段我完全不了解的代码,所以我想请你清楚地解释它,因为我想了解每一个概念。 C,因为我知道它是快速学习C ++的基础。

顺便说一句,我已经对JAVA有了不错的了解,希望这对你的解释设置有所帮助。

问题:

在这段代码中ndigit[c - '0']我不明白它要做什么,我从其他Stack Overlfow的问题中得知0应该引用 ASCI 标准,应该 48 ,但仍然不了解c和0之间的关系

3 个答案:

答案 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() 从输入中读取。假设 input5 。现在由于 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. 字符编码
  2. c 中的数组

答案 1 :(得分:1)

在此代码中,charchar,可能代表一个数字。在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编码)。因此,其他数字分别等于4957。因此'1'等于49'2'50等。因此'1' - '0'等于'49 - 48',即1并且'2' - '0'等于'50 - 48',即2,依此类推。

换句话说,c - '0'会将'5'之类的数字转换为等效的整数(5'5')。