2014-06-26 11 views
5

Ho visto esempi di questo in tutto il luogo:Perché l'aggiunta di uno "0" a una cifra int consente la conversione in un carattere?

int i = 2; 
char c = i + '0'; 
string s; 
s += char(i + '0'); 

Tuttavia, non ho ancora visto una spiegazione del perché l'aggiunta lo zero consente la conversione.

+0

Qual è 'char (i + '0'); 'in C++? (* Questa è una domanda reale. *) – this

+0

@questo compila su topcoder:/ – sgarza62

+2

@questo, è l'intero 'i' aggiunto con' '0'' promosso a un intero, il risultato viene eseguito su un 'char' con un cast in stile funzionale, che fa lo stesso di un cast in stile C. – chris

risposta

6

Se si guarda la tabella ASCII, asciitable, si vedrà che le cifre iniziano da 48 (essendo '0') e salgono a 57 (per '9'). Quindi, per ottenere il codice carattere per una cifra, è possibile aggiungere quella cifra al codice carattere di "0".

1

(char)(i+c) dove c è un char ti dà una nuova char con un valore ASCII pari a (valore ASCII del c) + i. Poiché i valori ascii delle cifre 0-9 sono sequenziali, i+'0' fornisce il carattere corrispondente a i, purché i si trovi nell'intervallo appropriato.

MODIFICA: (i+c) è un int, come evidenziato da Jarod42. Aggiunto un cast per mantenere la correttezza.

2

Si basa su valori ASCII. Aggiungendo il valore ASCII di 0 che è 48 significa che 48 + 5 sarà 53 o ASCII 53 che è 5.

Google ASCII e trova una buona tabella e studia. Avrebbe senso quando si guardano i valori per ogni carattere (carattere).

3

Il valore intero di '0' è 48.

'0' + 1 = 49 = '1' 
'0' + 2 = 50 = '2' 

... 

'0' + 9 = 57 = '9' 

Quindi, se si voleva convertire una cifra per il suo carattere corrispondente, basta aggiungere '0' ad esso.

3

i così com'è quando convertito in un char corrisponderà al suo token ascii (in questo caso STX) Vedi la tabella qui: http://www.asciitable.com/

Aggiungendo '0' al numero che si sta effettivamente diventando così il valore ASCII corretto .

Naturalmente avete toccato esattamente un problema con questo codice che è quello non è immediatamente evidente ciò che fa. Si dovrebbe considerare invece fare qualcosa di simile, se si desidera utilizzare c-style:

itoa(i); 

o meglio ancora bastone per C++:

std::stringstream ss; 
ss << i; 
ss.str(); //for strings 
ss.str().c_str(); // for c-style strings.