C阵列推,为什么减去' 0'?

时间:2014-02-07 00:54:17

标签: c arrays

我正在从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呢?当然这没有意义,对吧?

2 个答案:

答案 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。