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

FET*_*FET 2 c arrays

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

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

问题:

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

小智 6

简短回答:

\n

因为ndigit[c-'0']你没有进行正常的算术,例如 [5+5] = [10]。相反,您首先将字符转换为字符代码。然后用字符代码进行算术运算。

\n

简单地说,我们用“5”这个符号来表示英语中的“五”。其他语言有自己的 5 符号,即 \xe4\xba\x94 在日语中是 5。同样,计算机用53表示5(假设ascii,ascii就像一种语言)。因此ndigit[c-'0'],对于 ,它首先被转换为字符代码,然后进行算术运算。

\n

长答案:

\n

我们先过ndigit[c - '0']一遍。

\n
    \n
  • ndigit= 数组名称

    \n
  • \n
  • [ ]=索引,用于指定总元素数。

    \n
  • \n
  • c - '0'= 算术运算。c是一个变量。-是负数。并且\n'0'不是 0 而是 48。

    \n
  • \n
\n

现在让我添加书中的附加代码 -

\n
int ndigit[10];\n...//fill in the array with 0s\nwhile((c = getchar()) != EOF)\n    if(c >= '0' && c <= '9')\n         ++ndigit[c - '0']; //<== unable to understand this part\n
Run Code Online (Sandbox Code Playgroud)\n

这里需要注意的是getchar()。getchar()返回int 类型数据。即使它返回 int 类型,但它不会返回字符而是返回字符代码。让我举个例子——

\n
#include <stdio.h>\n\nint main(){\n    int c;\n    c = getchar();\n    printf("%d\\n", c);\n    }\n
Run Code Online (Sandbox Code Playgroud)\n

输出:

\n
@mix:~\n$ cc test.c\n@mix:~\n$ ./a.out\n5          ;wrote 5 in terminal\n53         ; printed 53 instead of 5\n
Run Code Online (Sandbox Code Playgroud)\n

5是角色。而53就是5的字符代码。

\n

现在让我们回到我们的主题ndigit[c - '0']c正在从 获取值getchar()。getchar() 从输入中读取。假设输入5。现在由于 getchar() 函数行为而不是 5,c 将包含 53。所以

\n
ndigit[c - '0'] == `ndigit[53 - '0']` != `ndigit[5 - '0']`\n
Run Code Online (Sandbox Code Playgroud)\n

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

\n
    ndigit[53 - '0']\n   =ndigit[53]       ;**wrong**\n
Run Code Online (Sandbox Code Playgroud)\n

using'0'意味着我们要使用字符代码(使用单引号)。如上所述'0' = 48(根据 ascii)。所以

\n
ndigit[53 - '0']\n\n= ndigit[53 - 48]\n\n= ndigit[5]\n
Run Code Online (Sandbox Code Playgroud)\n

现在我们取回被 读取的字符getchar()。但我们为什么要找回我们的性格呢?会ndigit[c]代替ndigit[c - '0']工作吗?

\n

ndigit[c]不会工作,因为在我们的代码开始时我们编写了ndigit[10] . 我们的ndigit[10]数组最多可以容纳 10 个元素。结果c不能大于 10 或ndigit[53]无效,因为其大小为 53 并超过 10 。这就是为什么我们要ndigit[c - '0']进行字符代码减法并得到小于 10 的值。

\n

如果还不清楚,请搜索并了解以下内容 -

\n
    \n
  1. 字符编码
  2. \n
  3. C 中的数组
  4. \n
\n