Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

Dlaczego zmiennej typu char nie można modyfikować 'na wyjściu' funkcją cout?

Ostatnio zmodyfikowano 2017-04-05 10:10
Autor Wiadomość
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:
C/C++
char a = 'a';
std::cout << a;
std::cout << a + 1;

wyświetla zupełnie co innego, niż na przykład:
C/C++
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!
P-159782
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:
C/C++
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:
C/C++
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ć:
C/C++
std::cout <<( char )( a + 1 );

http://en.cppreference.com/w​/cpp/language​/implicit_conversion
P-159783
mokrowski
» 2017-04-05 10:10:26
C/C++
std::cout << std::static_cast < char >( a + 1 );
P-159786
« 1 »
  Strona 1 z 1