5.1. Sayım Tipleri
C dilindeki temel veri tipleri arasında basamaklı sayı tipleri vardır (işaretli veya işaretsiz çeşitli boylarda tamsayılar). Bütün basamaklı tipler sınırlı ve doğrusal olarak sıralanmış bir değerler kümesi oluştururlar. C dili tarafından sağlananlar dışında, kullanıcının kendi basamaklı sayı tiplerini tanımlama olanağı vardır, bunlara sayım (veya sayılı) tipler denir. Böyle bir tipin tanımı, sırasıyla, bütün olası değerleri belirtir. Bunlar tanıtıcı sözcüklerle temsil edilir ve yeni tipin değişmezleri olurlar.
Sayım tiplerini tanımlamanın genel sözdizimi aşağıda verilmiştir:
enum tanıtıcı_sözcükopt { sayım_listesi }opt bild_belirteçleriopt ;
Tanıtıcı_sözcük’e sayım künyesi denir ve tanımlanmakta olan tipe verilen isteğe bağlı bir isimdir. Daha ileride, aynı tipten başka değişken veya fonksiyon tanımlamaları yapmak gerekirse, bu isim kullanılabilir.
Sayım_listesi virgülle ayrılmış tanıtıcı sözcüklerden oluşan bir listedir. Bunlara sayıcı adı verilir.
Bild_belirteçleri, olası ilkleyenlerle izlenen, değişkenlerden oluşan bir listedir.
Birkaç örnek:
enum islecler { arti, eksi, carpi, bolu } isl1 = arti, isl2 = carpi, islx; enum gunler { pa, pt, sa, ca, pe, cu, ct }; enum gunler ilk_gun = pa, bir_gun, son_gun = ct; enum { erkek, kadin } cinsiyetim = erkek, cinsiyetler[MAKSK];
İlk örnekte
tipini ve bu
tipten enum islecler
isl1
, isl2
, islx
değişkenlerini tanımlamaktayız. Bu değişkenler herhangi bir zamanda
arti
, eksi
, carpi
ve bolu
değerlerinin sadece bir tanesini alabilirler. Ayrıca,
isl1
ve isl2
değişkenleri sırasıyla
arti
ve carpi
değerleriyle ilklenirler.
İlkleme işlemi tamsayı değişken ilklemesine çok benzer, kuralları da
aynıdır. Üçüncü değişken, islx
, ilklenmemiştir, fakat, tıpkı
diğer değişkenler gibi yürütme esnasında buna da yukarıdakilerden bir değer
atanabilir.
İkinci ve üçüncü örneklerde de buna benzer bir tanımlama
yapılmakta, ancak bu sefer iki adımda olmaktadır. Önce
tipini tanımlıyoruz—henüz
değişken tanımı yok—sonra da enum gunler
ilk_gun
gibi değişkenleri bu tipten tanımlıyoruz.
Dördüncü tanımda künyeyi atlamış bulunuyoruz, böylece bundan sonra bu tipten yeni değişken veya fonksiyon tanımlamak istesek sayım_listesini tekrar belirtmek zorunda kalacağız. Bu örnekte ayrıca sayım tipinden elemanlardan oluşmuş bir dizi tanımlamasını da görmekteyiz.
Bu tanımlardan sonra, değişkenleri aşağıdaki gibi deyimlerde kullanabiliriz:
cinsiyetim = kadin; bir_gun = ca; islx = isl1; if (isl1==bolu) … while (bir_gun!=ct) … printf("%d %d %d\n", cinsiyetim, bolu, son_gun);
cinsiyetim
değişkeninin kadin
,
son_gun
’ün de ct
olduğunu varsayarsak,
son deyim 1 3 6
yazacaktır. Bunun nedeni, sayım tipinden olan
değişkenlerin aslında tamsayı değerleri sakladıkları ve değişmezlerin de
aslında tamsayı olduklarıdır. Örneğin, arti
, pa
ve erkek
’in değerleri 0
’dır,
eksi
1
, carpi
2
, bolu
3
’tür. Normalde
sayım değişmezlerine sıfırdan başlayarak sırayla değerler verilir, ancak C
dilinde programcının istediği değişmez tamsayıyı bir sayıcıya vermesine izin
verilir. Bundan sonra gelen sayıcılar da sonraki değerleri alırlar.
Örneğin,
enum renk { siyah, mavi, yesil, kirmizi=4, sari=14, beyaz };
Burada, siyah
’ın değeri
0
, mavi
’nin 1
,
yesil
’in 2
ve beyaz
’ın 15
’tir. Bir
enum
tanımında, iki sayıcı aynı değeri
alacak şekilde tanımlanabilirler. Bir sayıcı eksi bir değere sahip
olabilir.
Sayım tipinden olan değişkenler fonksiyonlara argüman olarak geçirilebilir ve bir fonksiyonun dönüş tipi sayım tipinden olabilir. Buna örnek bir fonksiyon aşağıda verilmiştir:
enum gunler gun_ekle (enum gunler g, int n) { return (enum gunler) (((int) g + n) % 7); }
Bu fonksiyon bir gün kabul edip n
gün
sonraki günü verir.
bir_gun = gun_ekle(pe, 31);
şeklindeki bir çağrı bir_gun
’e
pa
atayacaktır. Sayım tiplerini kalıplarda da
kullanabileceğimize dikkat ediniz. Bu örnekte iki tane kalıp kullanmaktayız:
Bir tanesi, hesap yapmak için günü tamsayıya dönüştürmede, diğeri de sonucu
tekrar
tipine dönüştürmede
kullanılır.enum gunler
Sayım tiplerinden olan değişkenlerin tamsayı olduğunu
düşünebilirsiniz, örneğin enum
değerlerinin girdi ve
çıktısını tamsayı biçiminde yapabilirsiniz. Yukarıda gun_ekle
fonksiyonundaki kalıpları kaldırıp return (g + n) % 7;
de yazabilirdik. Tıpkı int
değişkenleri gibi, sayıcıların (ve sonuçta sayım tipinden olan değişkenlerin)
alacakları değerler bir int
(modern derleyicilerde
32 bit) içine sığmalıdır.