Standart C Programlama Dili


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 enum islecler tipini ve bu tipten 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 enum gunler tipini tanımlıyoruz—henüz değişken tanımı yok—sonra da 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 enum gunler tipine dönüştürmede kullanılır.

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.