1.6. Tip Dönüşümü Ve Kalıplar
Bir işleç, işlenen(ler)ine uygulandığı zaman,
belirli bir tipten bir değer oluşturur. Meydana çıkan değerin tipi, işlecin
işlenen(ler)ine, işlecin kendisine ve tip dönüşümü kurallarına bağlıdır.
Örneğin, x+y
ifadesinin değeri hesaplandığı zaman, x
ve y
tamsayı ise ortaya çıkan değerin tipi de tamsayı olur. C
dilinde işleçlerin çoğu, değişik tiplerde işlenenleri kabul ettikleri için
genel olma özelliğini taşır. Örneğin, yukarıdaki ifadede eğer y
double
olsaydı, ortaya çıkacak değer de
double
tipinde olacaktı.
Değişik tipte işlenenlerin bulunduğu ifadelere karışık-tip ifadeler denir. Karışık-tip ifadelerin değerleri hesaplandığında, ara ve/veya sonuç değerlerin tipleri, ya dolaylı olarak otomatik tip dönüşümüyle belirlenir yada açık olarak kalıp kullanılarak kontrol edilir.
Değişik tipten iki işlenen varsa, C dili kurallarına göre, otomatik tip dönüşümü uygulanır. Bu kurallar şöyledir:
- Önce,
char
veshort
olan işlenenleriint
’e veya gerekiyorsaunsigned
’a dönüştür. - Sonra, aşağıdaki listeye uygun bir şekilde, düşük tipten olan işlenenin tipini daha yüksek tipten olanınkine dönüştür:
Tip | Düzey | |
---|---|---|
long double | en yüksek | |
double | : | |
float | : | |
unsigned long long | : | |
long long | : | unsigned long ’un tüm olası değerlerinin
long long tarafından içerildiği varsayılırsa |
unsigned long | : | |
long | : | unsigned ’ın tüm olası değerlerinin
long tarafından içerildiği varsayılırsa |
unsigned int | : | |
int | en düşük |
Tip dönüşümü üzerine birkaç örnek. i
, j
’nin
int
, x
’in
float
, d
’nin
double
ve c
’nin
char
olduğunu kabul edin.
i = j + x + d; c = c + 'A' - 'a';
İlk ifadede, j
float
’a
dönüştürülür, j+x
’in değeri
double
’a dönüştürülür ve
j+x+d
’nin değeri double
’dan
int
’e çevrilir. İkinci ifadede,
c
’deki küçük harfi büyüğe çevirmek
için tamsayı aritmetiği kullanılır.
Otomatik tip dönüşümü, programlarda önemli bir hata kaynağı olduğu için, tip dönüşümünün, açıkça kalıplar kullanılarak, kontrol edilmesi önerilir. Bir kalıp, basitçe, ifadenin önüne konulan parantez içine alınmış bir tiptir; yani,
(tip)ifade
ifadenin tipinin parantez içine alınmış olan tipe
dönüştürüleceğini gösterir. Gerçekte, parantez içine alınmış olan tip,
ifadenin değerini amaçlanan tipe dönüştüren özel bir işleçtir. Bu
işlecin önceliği diğer tekli işleçlerin önceliği ile aynıdır. İşte bazı
örnekler. x
, y
, z
’nin
float
, i
, j
’nin
int
olduğunu varsayın. y
ve z
’nin hesaplanmasındaki farka dikkat edin.
x = (float) i; y = (float) (i / j); /* int bölme işlemi */ z = (float) i / (float) j; /* float bölme işlemi */ i = (int) (x * (float) j);