2016-11-01 42 views
-4

我有下面的代碼片斷:瞭解特殊類型的接入的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'] a的值被改寫反正...

我很欣賞你的智慧!

+8

因爲''0'!= 0' – Biffen

+3

不確定它是否符合作爲複製但具有高度相關性:http://stackoverflow.com/questions/15598698/why-does-subtracting-0-in-c-result在這個數字中的字符代表 – NathanOliver

回答

1

「所以c必須是09之間」

No!c已是'0'之間'9',它有所不同。

每個字符都有適當的數值(ASCII碼),例如,克:

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

在C語言字符只是號碼,例如G。 'A' + 'B'是一個完美有效的表達式,意思是65 + 66

如果我們想顯示或閱讀digit(0,1,...,9),我們實際上使用它的符號表示形式,即i。即character('0','1',...,'9')。而這些字符令人驚訝還沒有 ASCII值0,1,...,9,但48,49,... 57 - 他們都是shifted by 48

因此用於轉換數字symbol,例如, G。 '7'(其具有ASCII值55-作爲7 + 48)轉換成我們在其中看到的number(即,7 - 無撇號),我們需要簡單地從它的ASCII值減去該移位數48

(7 + 48) - 48 

這是相同的,以減去'7'( '0'(= 48)= 55):

'7' - '0' 

和魔女到底是什麼呢表達

c - '0' 
您的代碼中有

2
當鍵入的輸入,該程序,你會得到與十六進制值X30一個字節的字符0

(見http://www.asciitable.com/

要訪問該陣列的第一個元素需要X00(二進制0)。從輸入的字符中減去x30會給你0.

該邏輯的工作原理是因爲0-9的ASCII代碼是x30,x31,... x39。所以subracting的0x30(或 '0' 同樣的事情)會給你0-9

+4

假設ASCII編碼或類似:不一定是真的。請注意,C++和C標準都堅持編碼在一個塊中按順序具有「0」到「9」。 – Bathsheba

+0

當然可能是一個非ascii機器 - 但我的10c說,它是 – pm100

+0

我知道它適用於任何編碼,但顯示真正的可能值使其更清晰 – pm100