这是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从char转换为integer。你可以减去48(='0')
那就是为什么我们使用++ndigit[c-'0'];
行
如果c ='5',我们将得到++ndigit['5' - '0']
++ndigit[ 53 - 48 ]
++ndigit[ 5 ]
就像我们想要的那样