Standart C Programlama Dili


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"});
}