繁体   English   中英

为什么我们需要“ -'0'”来修改数组?

[英]why we need “-'0'” to modify array?

这是Dennis Ritchie的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);
}

为什么我们在这一行中需要-'0'

++ndigit[c-'0'];

如果我将其更改为++ndigit[c] ,则该程序无法正常运行。 为什么我们不能只写++ndigit[c]

我已经读过这本书的解释,但我听不懂。

仅在“ 0”,“ 1”,...,“ 9”具有连续递增的值时才有效。 幸运的是,所有字符集都是如此。 根据定义,char只是小整数,因此char变量和常量与算术表达式中的int相同。 这是自然而方便的; 例如c-'0'是一个整数表达式,其值在0到9之间,与c中存储的字符'0'到'9'相对应,因此是数组ndigit的有效下标

要了解为什么我们需要“ -'0”,您首先需要了解ASCII表-http: //www.asciitable.com/

现在您需要了解C中的每个字符都由0到127之间的数字表示(其中extended为255)。

例如,如果您要为数字值打印字符“ 0”:

printf( "%d", '0' );

输出:48

现在,您已经声明了一个大小为10- ndigit[ 10 ]的数组,其中n单元格表示将数字n作为输入给出的次数。

因此,如果您收到“ 0”作为输入,则需要执行ndigit[ 0 ]++因此您需要从char转换为integer。 你可以减去48(='0')

那就是为什么我们使用++ndigit[c-'0'];

如果c ='5',我们将得到

++ndigit['5' - '0']

++ndigit[ 53 - 48 ]

++ndigit[ 5 ]

就像我们想要的那样

c = getchar()将存储读取到c的字符代码,它与字符代表的整数不同。

引用N1256 5.2.1字符集

在源基本字符集和执行基本字符集中,上述十进制数字列表中的每个0后面的字符的值应比前一个的值大1。

如此所示,十进制数字的字符代码是连续的,因此您可以通过从字符代码中减去'0' (即0的字符代码)将十进制数字的字符代码转换为字符所代表的整数。

总之, c-'0'产生c字符代表的整数。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM