理解访问c++ /C数组的特殊类型
Understanding special type of access C++/C array
我有以下代码片段:
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
必须在0
和9
之间"
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'
相关文章:
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 类型数组?
- 如何在使用 make_unique<T[]>() 制作的模板类型数组上使用 std::fill?
- 将基本类型数组中的内存重新用于不同(但仍然是基本)类型的数组合法吗
- 在C++中返回基元类型数组(Java比较)
- 如何返回 QVariant 类型数组
- 如何在本机 c++ jni 中实现 java 类型数组
- 模板类型数组的模板类型数组
- 如何确定未知类型数组的索引是否为空
- 复杂类型数组的静态初始化
- 访问基类型数组成员(Int-to-type习惯用法)
- 如何将 char 类型数组传递给函数并将第一个字符数组复制到第二个图表数组并使用 c++ 进行比较
- 如何在C 中制作结构类型数组
- 如何创建结构类型数组的地图对象
- C++类类型数组
- C++中的Matlab类型数组
- 节点C++插件 - 当类型数组(Float32Array)作为参数传递时,如何访问它?
- 如何将二维字符类型数组逐行保存到 c 中的.txt文件中
- C++:用户定义的类型数组出错
- 在双精度类型数组中使用 memset()