5.8.5. Bileşik Değişmezler
Bu altkısımda şimdiye kadar gördüğümüz değişmezlerden daha karmaşık olan ve C Standardına daha sonradan eklenen bileşik değişmezlere bakacağız. Bileşik değişmez kullanarak, sadece basit tipteki nesneler için değil, herhangi bir tipteki bir nesneye karşılık gelen bir değişmezi tanımlama olanağımız olur. Bir bileşik değişmez parantezler içine alınmış bir tip ile arkasından gelen ve çengelli parantezler içine alınmış ilkleyen listesinden oluşur:
( tip ) { ilkleyen_listesi }
Böyle bir ifadenin değeri, bahsi geçen tipe ve
ilkleyen_listesinde verilen değerlere sahip isimsiz
bir nesnedir. Bu ifade fonksiyon
blokları dışında kullanılırsa, ilkleyenlerin değişmez ifadelerden oluşması
gerekir. Bu şekilde tanımlanan isimsiz nesne kalıcı depolama özelliğine
sahip olur. Fonksiyonların içinde kullanıldığında ise ilkleyen listesindeki
ifadelerin değişmez olmasına gerek yoktur ve isimsiz nesne
auto
depolama özelliğine sahip olur.
Basit olarak isimsiz bir kayan noktalı sayı dizisi oluşturalım:
float * kng = (float []) { -1.5, 0.0, 1.5 };
İlk bakışta, bir dizi ilklemesine çok benzeyen
yukarıdaki örnek, fazla anlamlı gelmeyebilir.
Bir tane 3 elemanlık float
dizisi tanımlayıp,
ilkleyip, sonra da dizinin başlangıç adresini kng
göstergesine atadığımız zaman da aynı sonuca ulaşırız. Daha karmaşık
bazı örneklerde bileşik değişmezlerin yararlı özelliklerini görebiliriz.
Diziye karşılık gelen bir bileşik değişmez ifade yazarken, ilkleyen
listesinde dizinin elemanlarına denk gelen değişmezleri,
yukarıdaki örnekte görüldüğü gibi, sıra ile vermemiz gerekir. Ancak,
bir yapı için değişmez bir ifade yazarken, alternatif bir yöntem
bulunmaktadır: Yapının üye isimlerini kullanarak ve tamamını vermeden
ifademizi yazabiliriz. Bu durumda, değeri verilmemiş üyeler sıfıra
ilklenmiş olurlar. Aşağıdaki örnek programda yaz
fonksiyonuna kisi
yapısında birer nesne geçirilmektedir.
Bileşik değişmez ifade kullanmadan aynı işlemi yapmak için bir tane
kisi
tipinde değişken tanımlayıp, her fonksiyon çağrısı
öncesinde tüm üyelerini ilkleyip yaz
fonksiyonuna geçirmemiz
gerekecekti:
#include <stdio.h> typedef struct { char * isim; int dogumtarihi; enum { erkek, kadin } cinsiyet; char * meslek; } kisi; void yaz(kisi k) { printf("Isim: %-8s | Dogum Tar.: %4d | Cinsiyet: %c | Meslek: %-8s\n", k.isim, k.dogumtarihi, "EK"[k.cinsiyet], k.meslek); } int main(void) { yaz((kisi){.meslek="Muhendis",.isim="Ahmet"}); yaz((kisi){.isim="Mehmet",.dogumtarihi=1980}); yaz((kisi){.cinsiyet=kadin,.isim="Ayse", .dogumtarihi=1975,.meslek="Doktor"}); }