了解特殊类型的访问C ++ / C数组

时间:2016-11-01 19:01:16

标签: c++ c

我有以下代码段:

int ndigit[10] = {0,0,0,0,0,0,0,0,0,0};

void count() {
    char c;
    while (cin.get(c)) {
    if (c>='0' && c<='9') {
        ndigit[c-'0']++;
    }
}

所以c必须介于0和9之间(0和9),那么为什么有必要像ndigit[c-'0']那样索引数组而不仅仅是ndigit[c]

如果我是对的,在这两种情况下,c值可能会超过一次,因此ndigit[c-'0']的值无论如何都会被覆盖......

我感谢你的智慧!

2 个答案:

答案 0 :(得分:2)

当您输入字符0作为此程序的输入时,您将获得一个十六进制值为x30的字节(请参阅http://www.asciitable.com/

要访问数组的第一个元素,您需要x00(二进制0)。从类型化的字符中减去x30会得到0。

逻辑有效,因为0-9的ASCII码是x30,x31,.. x39。所以减去0x30(或'0'相同的东西)会给你0-9

答案 1 :(得分:1)

  

&#34;所以c必须介于09&#34;

之间

No! c必须介于'0''9'之间,这会有所不同。

每个字符都有适当的数值(ASCII码),e。 G:

  • &#39; A&#39;有65
  • &#39; B&#39;有66
  • &#39;一个&#39;有98

在C语言中字符只是数字,e。 G。 'A' + 'B'是完全有效的表达式,表示65 + 66

如果我们想要显示或读取digit(0,1,...,9),我们实际上使用它的符号表示,i。即一个character(&#39; 0&#39;,&#39; 1&#39;,...,&#39; 9&#39;)。这些字符非常没有 ASCII值0,1,...,9,但 48,49,... 57 - 它们都是shifted by 48

因此,对于转换数字symbol,e。 G。 '7'(其值为55 - 为7 + 48number我们人们在其中看到(即7 - 没有撇号),我们需要只需从ASCII值中减去此移位数48

    (7 + 48) - 48

与从&#39; 7&#39; (= 55)中减去&#39; 0&#39; (= 48)相同:

    '7' - '0'

和女巫正是表达式

    c - '0'

代码。