这个数组索引如何工作?

zla*_*ack 1 c arrays

我试图理解这是如何工作的(我知道它的作用,我只是不明白如何).据我所知,这会读取一个字符,直到达到EOF,如果它是一个数字,则把它放在数组中:

while ((c = getchar()) != EOF)
  if (c >= '0' && c <= '9')
    ++ndigit[c-'0'];
Run Code Online (Sandbox Code Playgroud)

我知道我可以像这样索引一个数组:

some_array[1] = 12;
Run Code Online (Sandbox Code Playgroud)

这将把12放在第二个元素中.

怎么c-'0'办?

(我从K&R的C编程语言第2版这本书中得到了这个)

i_a*_*orf 5

'0'是char强制转换为整数时的十进制值为48.它的工作原理是因为char是内置的序数类型.

如果你看一下反汇编,你可以看到这个:

      if (c >= '0' && c <= '9')
004135E3  movsx       eax,byte ptr [ebp-9] 
004135E7  cmp         eax,30h 
004135EA  jl          wmain+6Eh (41360Eh) 
004135EC  movsx       eax,byte ptr [ebp-9] 
004135F0  cmp         eax,39h 
004135F3  jg          wmain+6Eh (41360Eh) 
Run Code Online (Sandbox Code Playgroud)

请注意,我们将比较30十六进制和39十六进制,而不是'0'和'9'.