- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我终于开始阅读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 的值。
如果还不清楚,请搜索并了解以下内容-
关于ndigit[c - '0' ]的清晰解释,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36108040/
我终于开始阅读K&R,并且刚刚读到数组部分。但是在本节的示例中,有一段代码我真的不完全理解,所以我想请您对其进行清楚的解释,因为我想理解C的每个概念,因为我知道这是基础快速学习 C++。 顺便说一句,
我在使用 round() 时注意到一个奇怪的行为具有负舍入因子(参数 ndigits)和 decimal 的函数模块。 我正在使用 Python 3(特别是 3.6.3,但我不知道特定的次要版本是否对
当 ndigits 明确设置为 None 时,为什么 round() 对 int 和 float 的行为不同? Python 3.5.1 中的控制台测试: >>> round(1, None) Tra
我是一名优秀的程序员,十分优秀!