12. Rzutowanie
O rzutowaniu wspomniałem już w punkcie Mój pierwszy program. Mieliśmy tam do czynienia z taką oto sytuacją:
#include <stdio.h>
void main(void)
{
int a = 5, b = 3;
float r;
r = a / b;
printf(„r = %f
„, r);
}
Jak zapewne pamiętasz wynik tej operacji nieco Cię zaskoczył – nie było to „1.666667”, lecz po prostu „1.000000”. Działo się tak dlatego, że argumenty operacji dzielenia były typu całkowitego, a ten, jak wiesz, nie przechowuje informacji o części ułamkowej. W efekcie wynik operacji także był całkowity i ta właśnie całkowita wartość była przypisana zmiennej r. Aby temu zaradzić można wykorzystać tzw. rzutowanie. Jest to tymczasowa, tylko dla potrzeb obliczenia danego wyrażenia, zmiana typu. Typ ten jednak nie zmienia się fizycznie, po prostu kompilator traktuje zmienną danego typu tak, jakby była typu, na który ją rzutujemy. Tak więc nasz program możemy zapisać następująco:
#include <stdio.h>
void main(void)
{
int a = 5, b = 3;
float r;
r = (float)a / b;
printf(„r = %f
„, r);
}
Jak widzisz program ten niewiele różni się od poprzedniego. Jedyną różnicą jest to, że przed zmienną a przy operacji dzielenia dodany został taki oto ciąg znaków: „(float)”. Właśnie ten ciąg informuje kompilator, że zmienna (lub wyrażenie) następujące za nim ma być traktowane tak, jakby było typu float . W naszym przypadku mówimy kompilatorowi, żeby potraktował zmienną a jakby była typu rzeczywistego (czyli tak naprawdę rozszerza ją do postaci „5.0”), a następnie tą rzeczywistą liczbę podzielił przez zmienną b, która jest typu całkowitego.
Podumowując, rzutowanie wykorzystujemy, aby przy operacjach przypisania do siebie różnych typów poinformować kompilator, że wiemy, co robimy i ma on traktować to zgodnie z naszym życzeniem. Aby dokonać rzutowania danej zmiennej, czy wyrażenia na inny typ, należy przed nią (nim) wpisać w nawiasach typ, na który chcemy rzutować.