gpt4 book ai didi

ndigit[c - '0' ]的清晰解释

转载 作者:行者123 更新时间:2023-11-30 20:23:27 24 4
gpt4 key购买 nike

我终于开始阅读K&R,并且刚刚读到数组部分。但是在本节的示例中,有一段代码我真的不完全理解,所以我想请您对其进行清楚的解释,因为我想理解C的每个概念,因为我知道这是基础快速学习 C++。

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

问题:

在这段代码中ndigit[c - '0']我不明白它想做什么,我从其他Stack Overlfow问题中知道0应该指的是 ASCI标准应该是48,但仍然不明白c和0有什么关系

最佳答案

简短回答:

通过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() 从输入中读取。假设输入5。现在由于 getchar() 函数行为而不是 5,c 将包含 53。所以

ndigit[c - '0'] == `ndigit[53 - '0']` != `ndigit[5 - '0']`

另请注意,我们没有使用 0,而是使用“0”。表示算术 -

    ndigit[53 - '0']
=ndigit[53] ;**wrong**

using '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 中的数组

关于ndigit[c - '0' ]的清晰解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36108040/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com