1

声明的作用是ndigit[c-'0']什么?我正在使用ANSI C。

#include<stdio.h>
#include<string.h>
#include<stdlib.h>

int main()
{
    int c, i, ndigit[10];
    for(i = 0; i < 10; i++)
        ndigit[i]=0;
    while((c = getchar())!= EOF)
    {
        switch(c)
        {
            case '0' :case '1' :case '2' :case '3' :case '4' :case '5' :case '6' :case '7' :case '8' :case '9' : ndigit[c-'0']++;
            break;
        }
    }
    printf("digits=");
    for(i=0;i<10;i++) printf("%d",ndigit[i]);
    return 0;
}
4

1 回答 1

2

c 是一个 ascii 字符值(尽管以整数类型存储)。例如字符 '0' 在ascii中是 48 ,所以如果 getchar 返回字符 '0' 那么 c 将具有整数值 48。

c - '0' 对两个字符值进行减法(好的,它在减法之前将 '0' 转换为整数 48),提供一个准备索引到数组中的整数。

所以 char '1' 变成整数 1,char '2' 变成整数 2,等等。

对于一组已知的值,这只是一种将 ascii 字符值转换为整数值的快速方法。对于超出预期范围 '0'-'9' 的字符会产生奇怪的结果 - 例如,如果您使用字符 '+' 执行此操作,您会得到 -5,这不是一个好的数组索引。但这没关系,因为 switch 语句检查它是否在“0”-“7”范围内。

于 2013-08-10T11:03:40.483 回答