我终于开始阅读K&R,并且刚刚到达数组部分。但是在本节的示例中,有一段代码我真的不完全理解,所以我想请您对其进行清楚的解释,因为我想理解C的每个概念,因为我知道这是基础快速学习 C++。
顺便说一句,我已经对 JAVA 有一定的了解,希望这对您的解释设置有所帮助。
问题:
在这段代码中ndigit[c - '0'],我不明白它想要做什么,我从其他 Stack Overlfow 问题中知道 0 应该引用 ASCI标准并且应该是48,但仍然不明白 c 和 0 有什么关系。
小智 6
简短回答:
\n因为ndigit[c-'0']你没有进行正常的算术,例如 [5+5] = [10]。相反,您首先将字符转换为字符代码。然后用字符代码进行算术运算。
简单地说,我们用“5”这个符号来表示英语中的“五”。其他语言有自己的 5 符号,即 \xe4\xba\x94 在日语中是 5。同样,计算机用53表示5(假设ascii,ascii就像一种语言)。因此ndigit[c-'0'],对于 ,它首先被转换为字符代码,然后进行算术运算。
长答案:
\n我们先过ndigit[c - '0']一遍。
ndigit= 数组名称
[ ]=索引,用于指定总元素数。
c - '0'= 算术运算。c是一个变量。-是负数。并且\n'0'不是 0 而是 48。
现在让我添加书中的附加代码 -
\nint 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\nRun Code Online (Sandbox Code Playgroud)\n这里需要注意的是getchar()。getchar()返回int 类型数据。即使它返回 int 类型,但它不会返回字符,而是返回字符代码。让我举个例子——
#include <stdio.h>\n\nint main(){\n int c;\n c = getchar();\n printf("%d\\n", c);\n }\nRun 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\nRun Code Online (Sandbox Code Playgroud)\n5是角色。而53就是5的字符代码。
\n现在让我们回到我们的主题ndigit[c - '0']。c正在从 获取值getchar()。getchar() 从输入中读取。假设输入是5。现在由于 getchar() 函数行为而不是 5,c 将包含 53。所以
ndigit[c - '0'] == `ndigit[53 - '0']` != `ndigit[5 - '0']`\nRun Code Online (Sandbox Code Playgroud)\n另请注意,我们没有使用 0。而是使用“0”。\n表示算术 -
\n ndigit[53 - '0']\n =ndigit[53] ;**wrong**\nRun Code Online (Sandbox Code Playgroud)\nusing'0'意味着我们要使用字符代码(使用单引号)。如上所述'0' = 48(根据 ascii)。所以
ndigit[53 - '0']\n\n= ndigit[53 - 48]\n\n= ndigit[5]\nRun Code Online (Sandbox Code Playgroud)\n现在我们取回被 读取的字符getchar()。但我们为什么要找回我们的性格呢?会ndigit[c]代替ndigit[c - '0']工作吗?
ndigit[c]不会工作,因为在我们的代码开始时我们编写了ndigit[10] . 我们的ndigit[10]数组最多可以容纳 10 个元素。结果c不能大于 10 或ndigit[53]无效,因为其大小为 53 并超过 10 。这就是为什么我们要ndigit[c - '0']进行字符代码减法并得到小于 10 的值。
如果还不清楚,请搜索并了解以下内容 -
\n