我从一本关于 C 编程的电子书中摘录了这个。
我知道字符 '0' 和 '9' 的 ASCII 表示是整数,所以我理解与整数数组的兼容性。我只是不确定显示的输出是如何计算的?输入是代码本身。
这个声明是什么意思?
++ndigit[c-'0'];
那么,程序本质上是否检查输入是否是 ASCII 代码表的前 10 部分之一? ASCII码
不,它没有。
c - '0'
0
从. 中减去字符的(不一定是 ASCII)字符代码c
。如果是一个数字,这将产生一个介于 0 和 9 之间c
的数字。然后,得到的整数用于使用运算符对零初始化ndigit
数组进行索引[]
,然后使用前缀递增运算符 ( ++
) 来递增该特定索引处的元素。
顺便说一句,代码在多个地方都是错误的。我建议您切换到另一本书,因为这本书似乎已经过时和/或鼓励使用几种类型的不良编程实践。
首先,main()
没有返回类型,这是一个错误。它需要声明为int main()
orint main(void)
或int main(int, char **)
。旧的编译器有一个坏习惯,即假设隐式int
返回类型被省略,但这种行为现在已被弃用。
其次,最好初始化ndigit
数组,如下所示:
int ndigit[10] = { 0 };
for 循环是多余的,因为我们可以进行初始化;它也比初始化语法可读性差,而且也很危险:作者没有使用 来计算数组的计数sizeof(ndigits) / sizeof(ndigits[0])
,但是他硬编码了它的长度,这可能会在数组长度改变(减少)时导致缓冲区溢出并且忘记了 for 循环中的硬编码长度值。
该程序计算 0 到 9 之间的数字作为输入被引入的次数、输入中的空格数和其他字符数。
++ndigit[c-'0'];
'0' - 整数是 0 的 ASCII 码。
c - 是读取的字符(其 ASCII 码)
c - '0' = 由 ASCII 码 c 表示的实际数字(0 到 9 之间)。
例如 '3'(ASCII) 将是 3(digit=integer) + '0'(ASCII)
这就是你如何在数组中为你的数字获取索引并增加该数字出现的次数。