C中数字字符的数字值

ubi*_*con 1 c primitive-types

我刚刚开始阅读C语言编程,我无法理解一个部分.以下是第24页的摘录:

#include<stdio.h>

/*countdigits,whitespace,others*/

main()
{
  intc,i,nwhite,nother;
  intndigit[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']; //THIS IS THE LINE I AM WONDERING ABOUT
      else if(c==''||c=='\n'||c=='\t')
          ++nwhite;
      else
          ++nother;

  printf("digits=");
  for(i=0;i<10;++i)
      printf("%d",ndigit[i]);
  printf(",whitespace=%d,other=%d\n",
      nwhite,nother);
}
Run Code Online (Sandbox Code Playgroud)

该程序的输出本身就是

digits=9300000001,whitespace=123,other=345
Run Code Online (Sandbox Code Playgroud)

声明

intndigit[10];
Run Code Online (Sandbox Code Playgroud)

将ndigit声明为10个整数的数组.数组下标总是从C开始为零,因此元素是

ndigit[0], ndigit[ 1], ..., ndigit[9]
Run Code Online (Sandbox Code Playgroud)

这反映在初始化和打印数组的for循环中.下标可以是任何整数表达式,包括整数变量,如i和整数常量.此特定程序依赖于数字的字符表示的属性.例如,测试

if(c>='0'&&c<='9')
Run Code Online (Sandbox Code Playgroud)

确定c中的字符是否为数字.如果是,则该数字的数值为

c-'0'`
Run Code Online (Sandbox Code Playgroud)

仅当'0','1',...,'9'具有连续增加的值时,这才有效.幸运的是,对于所有字符集都是如此.根据定义,字符只是小整数,因此char变量和常量与算术表达式中的int相同.这很自然方便; 例如

c-'0'
Run Code Online (Sandbox Code Playgroud)

是一个整数表达式,其值介于0和9之间,对应于存储在c中的字符"0"到"9",因此是数组ndigit的有效下标.

我无法理解的-'0'部分是为什么表达部分是必要的c-'0'.如果一个字符是作者所说的小整数,并且数字字符对应于它们的数值,那么正在-'0'做什么?

Joe*_*Joe 7

数字字符与其数字值不对应.它们对应于它们的编码值(在本例中为ASCII).

IIRC,ascii'0'是值48.并且,幸运的是,对于该示例和大多数字符集,"0"到"9"的值按字符集顺序存储.

因此,从任何ASCII数字中减去"0"的ASCII值将返回其"0"的"真"值.

  • 无论编码如何,C标准都保证"0"到"9"是连续的. (2认同)