2014-06-26 5 views
5

Widziałem przykłady to wszędzie:Dlaczego dodanie cyfry "0" do liczby int umożliwia konwersję na znak?

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

Jednak ja jeszcze nie widziałem wyjaśnienie dlaczego dodanie zera pozwala na konwersję.

+0

Co jest 'char (i + '0'); 'in C++? (* To jest faktyczne pytanie. *) – this

+0

@to to kompiluje na topcoder:/ – sgarza62

+2

@this, Jest to liczba całkowita 'i' dodana z' '0'' promowana do liczby całkowitej, wynik jest rzutowany na 'char' z funkcjonalnym stylem obsady, który działa tak samo, jak obsada w stylu C. – chris

Odpowiedz

6

Jeśli spojrzysz na tabelę ASCII, asciitable, zobaczysz, że cyfry zaczynają się od 48 ("0") i idą do 57 (dla "9"). Aby uzyskać kod znaku dla cyfry, można dodać tę cyfrę do kodu znaku "0".

1

(char)(i+c) gdzie c jest char daje nową char z wartością ASCII równym (wartość ASCII c) + i. Ponieważ wartości ascii cyfr 0-9 są sekwencyjne, i+'0' daje znak odpowiadający i, o ile i leży w odpowiednim zakresie.

EDYCJA: (i+c) jest int, jak wskazał Jarod42. Dodano obsadę, aby zachować poprawność.

2

Jest oparty na wartościach ASCII. Dodanie wartości ASCII równej 0 oznacza 48, że 48 + 5 będzie 53 lub ASCII 53, czyli 5.

Google ASCII i znajdź dobry wykres i przestudiuj go. Powinno to mieć sens po spojrzeniu na wartości dla każdego znaku (znaku).

3

Wartość całkowita liczby '0' to 48.

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

... 

'0' + 9 = 57 = '9' 

Tak więc, jeśli chcesz przekonwertować cyfrę odpowiadającą jej charakteru, po prostu dodaj '0' do niego.

3

i, gdyż stoi po przekonwertowaniu do char będzie odpowiadać jego ascii tokena (w tym przypadku STX) Patrz tabela tutaj: http://www.asciitable.com/

Dodając '0' do numeru, który skutecznie czyni go prawidłową wartość ASCII .

Oczywiście dotknąłeś dokładnie problemu z tym kodem, który jest taki, że nie jest od razu oczywiste, co robi. Należy rozważyć zamiast robić coś takiego, jeśli chcesz używać C-style:

itoa(i); 

lub nawet lepiej trzymać się C++:

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