我正在从C编程语言第二版学习C语言。其中,有以下代码:
#include <stdio.h>
/* count digits, white space, others */
main() {
int c, i, nwhite, nother;
int ndigit[10];
nwhite = nother = 0;
for (i=0; i<10; ++i) {
ndigit[i] = 0;
}
while ((c = getchar()) != EOF) {
if (c >= '0' && c <= '9') {
++ndigit[c-'0'];
}
else if (c == ' ' || c == '\n' || c == '\t') {
++nwhite;
}
else {
++nother;
}
}
printf("digits =");
for (i=0; i<10; ++i) {
printf(" %d", ndigit[i]);
}
printf(", white space = %d, other = %d\n", nwhite, nother);
}
现在,我可以理解这段代码在做什么。它计算每个数字在输入中出现的次数,然后将该计数放入数字的索引中,即11123 = 0 3 1 1 0 0 0 0.我只是好奇它的1行:
++ndigit[c-'0'];
这会将数组的索引c加1,但为什么从c中减去0呢?当然这没有意义,对吧?
答案 0 :(得分:3)
表达式c - '0'
正在从数字的字符表示转换为相同数字的实际整数值。例如,它将char '1'
转换为int 1
我认为在这里查看完整的例子会更有意义
int charToInt(char c) {
return c - '0';
}
charToInt('4') // returns 4
charToInt('9') // returns 9
答案 1 :(得分:1)
它没有减去零...它减去了字符'0'的ASCII值。
这样做会为您提供数字的序数值,而不是ASCII表示。换句话说,它将字符'0'到'9'分别转换为数字0到9。