2016-11-01 1 views
-4

Ich habe den folgenden Code-Schnipsel:Verständnis spezielle Art des Zugriffs 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']++; 
    } 
} 

So c hat zwischen 0 und 9 (mit 0 und 9) sein, warum so ist es zu indizieren notwendig die Array wie ndigit[c-'0'] statt nur ndigit[c]?

Wenn ich Recht habe, in beiden Fällen ein c Wert kann mehr als einmal auftreten, so dass eine der Wert ndigit[c-'0'] wird sowieso überschrieben ...

Ich schätze Ihre Weisheit!

+8

Weil ''0'! = 0' – Biffen

+3

Nicht sicher, ob es als dupe aber in hohem Grade verwandt ist: http://stackoverflow.com/questions/15598698/why-does-subtracting-0-in-c-result -in-the-number-that-the-char-is-repräsentiert – NathanOliver

Antwort

1

"So c zwischen 0 sein und 9"

No!c zwischen '0' sein hat und '9', und es macht den Unterschied.

Jedes Zeichen hat einen entsprechenden numerischen Wert (ASCII-Code), z. .: g

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

in C-Sprache Zeichen sind einfach Zahlen, E hat. G. 'A' + 'B' ist ein perfekt gültiger Ausdruck und bedeutet 65 + 66.

Wenn wir eine digit (0, 1, ..., 9) anzeigen oder lesen wollen, verwenden wir tatsächlich seine symbolische Darstellung, i. e. eine character ('0', '1', ..., '9'). Und diese Zeichen erstaunlich haben nicht ASCII-Werte 0, 1, ..., 9, aber 48, 49, ... 57 - sie sind alle shifted by 48.

So zum Umwandeln einer Ziffer symbol, e. G. '7' (die ASCII-Wert 55 - wie 7 + 48 hat) in eine number die wir Leute darin sehen (d. H. E.7 - ohne Apostroph), wir müssen einfach subtrahieren diese Verschiebung Nummer 48 von seinem ASCII-Wert:

(7 + 48) - 48 

die gleich ist wie '0' (= 48) aus '7' (= subtrahieren 55):

'7' - '0' 

und Hexe ist genau das, was der Ausdruck tut

c - '0' 

in Ihrem Code.

2

, wenn Sie die Zeichen 0 als Eingabe für dieses Programm geben Sie ein Byte mit dem Hex-Wert x30 erhalten werden (siehe http://www.asciitable.com/)

Um das erste Element des Arrays zugreifen müssen Sie x00 (binär 0) gewonnen. Das Subtrahieren von x30 von dem eingegebenen Zeichen ergibt 0.

Die Logik funktioniert, weil die ASCII-Codes für 0-9 x30, x31, .. x39 sind. So subracting 0x30 (oder '0' gleiche) gibt Ihnen 0-9

+4

Angenommen, ASCII-Codierung oder ähnliches: nicht unbedingt wahr. Beachten Sie, dass sowohl die C++ - als auch die C-Standards darauf bestehen, dass die Kodierungen "0" bis "9" in der Reihenfolge und in einem einzigen Block haben. – Bathsheba

+0

könnte natürlich eine nicht-ASCII-Maschine sein - aber meine 10c sagt, dass es – pm100

+0

ich weiß, es funktioniert mit jeder Codierung, aber zeigt echte wahrscheinliche Werte macht es klarer – pm100

Verwandte Themen