Dlaczego zmiennej typu char nie można modyfikować 'na wyjściu' funkcją cout?
Ostatnio zmodyfikowano 2017-04-05 10:10
e5500 Temat założony przez niniejszego użytkownika |
Dlaczego zmiennej typu char nie można modyfikować 'na wyjściu' funkcją cout? » 2017-04-05 00:52:53 Jest to dla mnie trochę niezrozumiała sprawa. Nie rozumiem dlaczego zapis taki: char a = 'a'; std::cout << a; std::cout << a + 1;
wyświetla zupełnie co innego, niż na przykład: char a = 'a'; std::cout << a; a++; std::cout << a;
Domyślam się, że być może funkcja cout dodaje do zmiennej a niewłaściwego typu wartości, odpowiednie dla zmiennych liczbowych i w efekcie powstaje bezsensowna mieszanka jednego i drugiego. Czy może jest jakiś inny powód? Z góry dziękuję za odpowiedzi! |
|
Bielan |
» 2017-04-05 01:14:16 W pierwszym przypadku aby wykonać działanie (char) + (int) trzeba sprowadzić typy do wspólnego typu. W takim przypadku (char) będzie promowany do (int) a wartość (int) będzie zależeć od wartości kodu ASCII danego znaku. Zasady konwersji/promocji znajdziesz na internecie. Zatem tak naprawdę mamy tutaj: std::cout <<( int )( a ) + 1;
A takie wyrażenie tymczasowe zwraca typ int . Dlatego std::cout jest przekonany, że to int i wyświetla to jako int W drugim przypadku cała konwersja/promocje są wykonywane poza std::cout . Zatem tak naprawdę mamy tutaj: a =( char )(( int ) a + 1 ); std::cout << a;
Zmienna jest promowana, a wynik zapisywany z powrotem do char (zmienna nie zmieni swojego typu, zostanie zastosowana konwersja). Dlatego aby program zrobił to co chcesz to musisz mu to jawnie powiedzieć: std::cout <<( char )( a + 1 );
http://en.cppreference.com/w/cpp/language/implicit_conversion |
|
mokrowski |
» 2017-04-05 10:10:26 std::cout << std::static_cast < char >( a + 1 );
|
|
« 1 » |