44 ROZDZIAŁ 8. OPERATORY Rzutowanie Zadaniem rzutowania jest konwersja danej jednego typu na daną innego typu. Kon- wersja może być niejawna (domyślna konwersja przyjęta przez kompilator) lub jawna (podana explicite przez programistę). Oto kilka przykładów konwersji niejawnej: int i = 42.7; /* konwersja z double do int */ float f = i; /* konwersja z int do float */ double d = f; /* konwersja z float do double */ unsigned u = i; /* konwersja z int do unsigned int */ f = 4.2; /* konwersja z double do float */ i = d; /* konwersja z double do int */ char *str = "foo"; /* konwersja z const char* do char* [1] */ const char *cstr = str; /* konwersja z char* do const char* */ void *ptr = str; /* konwersja z char* do void* */ Podczas konwersji zmiennych zawierających większe ilości danych do typów prost- szych (np. double do int) musimy liczyć się z utratą informacji, jak to miało miejsce w pierwszej linijce — zmienna int nie może przechowywać części ułamkowej toteż została ona odcięta i w rezultacie zmiennej została przypisana wartość 42. Zaskakująca może się wydać linijka oznaczona przez 1. Niejawna konwersja z typu const char* do typu char* nie jest dopuszczana przez standard C. Jednak literały na- pisowe (które są typu const char*) stanowią tutaj wyjątek. Wynika on z faktu, że były one używane na długo przed wprowadzeniem słówka const do języka i brak wspomnia- nego wyjątku spowodowałby, że duża część kodu zostałaby nagle zakwalifikowana jako niepoprawny kod. Do jawnego wymuszenia konwersji służy jednoargumentowy operator rzutowania, np.: double d = 3.14; int pi = (int)d; /* 1 */ pi = (unsigned)pi 4; /* 2 */ W pierwszym przypadku operator został użyty, by zwrócić uwagę na utratę pre- cyzji. W drugim, dlatego że bez niego operator przesunięcia bitowego zachowuje się trochę inaczej. Obie konwersje przedstawione powyżej są dopuszczane przez standard jako jawne konwersje (tj. konwersja z double do int oraz z int do unsigned int), jednak niektóre konwersje są błędne, np.: const char *cstr = "foo"; char *str = cstr; W takich sytuacjach można użyć operatora rzutowania by wymusić konwersję: const char *cstr = "foo"; char *str = (char*)cstr; Należy unikać jednak takich sytuacji i nigdy nie stosować rzutowania by uciszyć kompilator . Zanim użyjemy operatora rzutowania należy się zastanowić co tak napraw- dę będzie on robił i czy nie ma innego sposobu wykonania danej operacji, który nie wymagałby podejmowania tak drastycznych kroków.
... zobacz całą notatkę
Komentarze użytkowników (0)