代码之家  ›  专栏  ›  技术社区  ›  ubiquibacon

C中数字字符的数值

  •  1
  • ubiquibacon  · 技术社区  · 15 年前

    我刚开始通读 The C Programming Language 我很难理解其中的一部分。以下是第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);
    }
    

    此程序在自身上运行的输出是

    digits=9300000001,whitespace=123,other=345
    

    intndigit[10];
    

    ndigit[0], ndigit[ 1], ..., ndigit[9]
    

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

    if(c>='0'&&c<='9')
    

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

    c-'0'`
    

    仅当“0”、“1”、“…”和“9”具有连续递增的值时,此操作才有效。幸运的是,这适用于所有角色集。根据定义,char只是小整数,所以char变量和常量与算术表达式中的int相同。这是自然和方便的;例如

    c-'0'
    

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

    -'0' 部分在表达式中是必需的 c-'0' . 如果一个字符如作者所说是一个小整数,并且数字字符对应于它们的数值,那么是什么呢

    5 回复  |  直到 6 年前
        1
  •  7
  •   Joe    15 年前

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

    IIRC,ascii“0”是值48。幸运的是,对于本例和大多数字符集,“0”到“9”的值都是按顺序存储在字符集中的。

    因此,从任何ASCII数字中减去“0”的ASCII值将返回其“真”值0-9。

        2
  •  3
  •   Mark Byers    15 年前

    通过将字符“0”的值减去48,变为0,“1”变为1,以此类推 c - '0' 实际上,您不需要知道“0”的ASCII值是什么(或者系统正在使用ASCII—它可能正在使用) EBCDIC ). 唯一重要的是这些值是连续递增的整数。

        3
  •  0
  •   James    15 年前

    它将从键盘上“0”键的ASCII码转换为值0。

    如果你做了int x='0'+'0',结果就不会是零。

        4
  •  0
  •   Carl Norum    15 年前

    在大多数字符编码中,所有数字都连续地放置在字符集中。例如,在ASCII中,它们以 '0' 0x30 '1' 0x31 , '2' 0x32 等)。如果你想要一个给定数字的数值,你可以直接减去 '0' 从中得到正确的值。使用的优点 与特定值不同的是,您的代码可以轻松移植到其他字符集。

        5
  •  0
  •   Nils Pipenbrinck    15 年前

    如果通过字符串的字符访问字符串,即使字符恰好是数字,也会返回ASCII值。

    代码就是这么做的。我不得不承认,当你第一次看到它时,你会感到困惑,但这不是火箭科学。

    “0”的ASCII字符值是48,“1”是49,“2”是50,依此类推。

    http://www.sciencelobby.com/ascii-table/images/ascii-table1.gif