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

Understanding special type of access C++/C array

本文关键字:类型 数组 访问 c++      更新时间:2023-10-16

我有以下代码片段:

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']的值无论如何都会被覆盖…

我欣赏你的智慧!

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

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

逻辑工作,因为0-9的ASCII码是x30,x31,…x39。因此减去0x30(或'0')将得到0-9

"所以c必须在09之间"

No! c必须介于'0''9'之间,这是有区别的。

每个字符都有相应的数值(ASCII码),例如:

  • 'A'有65
  • 'B'有66
  • 'a'有98

在C语言中字符就是简单的数字,例如:'A' + 'B'是一个完全有效的表达式,表示65 + 66

如果我们想显示或读取digit(0,1,…), 9),我们实际上使用它的符号表示,即character('0', '1',…"9")。令人惊讶的是,这些字符没有 ASCII值0,1,…, 9,但 48,49,…57 -它们都是shifted by 48 .

因此,为了将数字symbol,例如'7'(其ASCII值55 -作为7 + 48)转换为我们在其中看到的number(即7 -没有撇号),我们只需从其ASCII值中减去这个移位数字48:

    (7 + 48) - 48

这是一样的减去 ' 0 ' (= 48) "7" (= 55):

    '7' - '0'

和巫婆正是表达式

    c - '0'