我有以下代码段:
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 :(得分: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
必须介于0
和9
&#34;
No!
c
必须介于'0'
和'9'
之间,这会有所不同。
每个字符都有适当的数值(ASCII码),e。 G:
在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 + 48
)number
我们人们在其中看到(即7
- 没有撇号),我们需要只需从ASCII值中减去此移位数48
:
(7 + 48) - 48
与从&#39; 7&#39; (= 55)中减去&#39; 0&#39; (= 48)相同:
'7' - '0'
和女巫正是表达式
c - '0'
代码。