Standart C Programlama Dili


1.3. Temel Veri Tipleri Ve Tanımlar

Bir değişken ismi, değişkenin alacağı değerlerin türü ve işlevini yansıtacak şekilde dikkatlice seçilen bir tanıtıcı sözcüktür. Genelde, kalan_gunler veya kalanGunler şeklinde bir değişken ismi x132 gibi bir isme tercih edilmelidir. Değişken isimlerinde büyük harfler yerine küçük harflerin kullanılması alışılagelmiştir.

Bir C programında, kullanılmadan önce, tüm değişken ve fonksiyonların tanımı veya bildirimi yapılmalıdır. Temel veri tiplerinin, yani tamsayı, kayan noktalı sayılar ve karakterlerin bildiriminde kullanılan anahtar sözcükler şunlardır:

int tamsayı
signed, unsigned işaretli veya işaretsiz tamsayılar
short, long, long long kısa veya uzun tamsayılar
float, double, long double tek, çift veya dörtlü duyarlıklı kayan noktalı sayılar
char karakter

Karakter dizisi tanımlamak için bir anahtar sözcük olmadığına dikkat edin; bunun için elemanları karakter olan normal diziler kullanılır.

Bir tanım, bir tip ismi ile tanımlanmakta olan nesnelerin virgülle ayrılmış listesinden oluşur ve bir noktalı virgül ile sona erer. Aşağıda birkaç örnek tanım gösterilmiştir:

int    x;
int    x1, y1, z1;
long   d, d1;
char   c;
char   c1, c2, c3;
float  a;
float  a1, a2, a3;
int    u[3];
float  k[10*20];

Son iki tanımda, tek boyutlu ve üç elemanlı bir tamsayı dizisi ile tek boyutlu ve 200 elemanlı kayan noktalı sayılardan oluşan bir dizi tanımlanmıştır. Dizinin boyunun derleme esnasında hesaplanabilen ve 200’e karşılık gelen değişmez bir ifade olduğuna dikkat edin.

Aşağıda görüldüğü gibi, değişkenler tanımlandıkları zaman ilk değerleri de verilebilir:

int   x  = 0;
int   x1 = 10, x2 = 20, x3 = 30,
      x4 = 60 * 60;   /* ilk değer değişmez bir ifadedir: 3600 */
char  c1 = 'a', c2 = 'z';

Buna ilkleme diyoruz. İlk değer olarak bir ifadenin de yazılabileceğine dikkat edin. Tanımlanan değişkenlerin ilklenmesi iyi bir alışkanlıktır.

İsimlendirilmiş değişmezler, yani değerleri değiştirilemeyecek olan değişkenler, const tip niteleyicisi kullanılarak tanımlanırlar:

const int    x  = 100;
const char   ys = '\n';
const float  a  = 123.45;
const double pi = 3.1415926535897932384626433832795;

Bu tip değişmez değişkenlerin const ile tanımlanmasının en azından iki avantajı vardır:

  1. Programcı yanlışlıkla bu tip bir değişkene atama yapmaya kalkar veya değerini değiştirebilecek bir şekilde kullanmaya kalkarsa, derleyici onu uyaracaktır.
  2. Çok kullanıcılı sistemlerde bu tip değişkenlerin ortak ve değiştirilemez bir bellek kesimine yüklenmesi sağlanabilir.

Aynı anda başka bir süreç (program) veya iş parçacığı tarafından kullanılan veya değiştirilebilen değişkenlerin, derleyicinin olası bir eniyileme yapmasını engellemek için, volatile tip niteleyicisi kullanılarak tanımlanması gerekmektedir. Örneğin, çok kullanıcılı ortamlarda iki değişik süreç tarafından ortak kullanılan bir değişkenin volatile tanımlanması gerekir. Başka bir örnek olarak, mevcut program dışında güncellenen ve gerçek zamanı tutan bir değişkenin, mevcut program tarafından değiştirilememesi, ancak mevcut program tarafından yapılacak yinelenen erişimler esnasında derleyici eniyilemesine tabi tutulmaması için şu şekilde tanımlanması uygun olur:

const volatile int real_time_clock;

Tanımlanmış bir değişken, bir deyim içinde ismi verilerek anılır. Dizi elemanlarına ulaşmak için çeşitli yollar olmasına rağmen, çoğu zaman dizi isminin arkasına köşeli parantezler içinde indis belirtilerek kullanılırlar. Eleman sayısı BOY olan bir dizi için indisin alabileceği değerler 0’dan BOY-1’e kadar değişir. Yani, yukarıda tanımlanmış olan u tamsayı dizisinin elemanları u[0], u[1] veya u[2] şeklinde kullanılabilir. İndisin her zaman değişmez bir tamsayı olmasına gerek yoktur; genelde bir ifade olur. Yani, u[x+5] geçerli bir kullanımdır. Doğal olarak, eğer x+5 ifadesinin değeri 0, 1 veya 2 değilse, beklenmeyen sonuçlar elde edilebilir. Bu tip kullanımları kontrol altında tutmak tamamen programcının sorumluluğundadır. Yukarıdaki örnekten devam edersek, u[-1] veya u[4] gibi, diziye ait olmayan elemanları okumaya veya değiştirmeye kalktığımızda beklemeyen sonuçlar (başka verilerin zarar görmesi, programın hata alıp sonlanması veya döngüye girmesi) ortaya çıkabilir.

Değişik tiplerde tanımlanmış değişkenler için, mevcut derleyiciler tarafından tipik olarak ayrılan bellek miktarı ile alt ve üst limit değerleri aşağıdaki tabloda verilmiştir. Tip tanımında parantez içine yazılmış kısmın belirtilmesine gerek yoktur, örneğin signed short int ile short aynı anlama gelir.

Tip tanımı 16 bit
ortam
32 bit
ortam
64 bit
ortam
char 1 1 1
signed char 1s 1s 1s
unsigned char 1u 1u 1u
(signed) short (int) 2s 2s 2s
(signed) int veya signed (int) 2s 4s 4s
(signed) long (int) 4s 4s 4s/8s
(signed) long long (int) -- 8s 8s
unsigned short (int) 2u 2u 2u
unsigned (int) 2u 4u 4u
unsigned long (int) 4u 4u 4u/8u
unsigned long long (int) -- 8u 8u
float 4f 4f 4f
double 8f 8f 8f
long double 8f 12f/16f 12f/16f

1 : Bir bayt, (gerçeklemeye bağlı olarak) -127…127 veya 0…255.

1s : Bir bayt, -127…127.

1u : Bir bayt, 0…255.

2s : İki bayt, -215…215-1 = -32768…32767.

2u : İki bayt, 0…216-1 = 0…65535.

4s : Dört bayt, -231…231-1 = -2147483648…2147483647.

4u : Dört bayt, 0…232-1 = 0…4294967295.

8s : Sekiz bayt, -263…263-1 = -9223372036854775808…9223372036854775807.

8u : Sekiz bayt, 0…264-1 = 0…18446744073709551615.

4f : Dört bayt, -1038…-10-38, 0, 10-38…1038 (yaklaşık 6 ondalık rakam duyarlık).

8f : Sekiz bayt, -10308…-10-308, 0, 10-308…10308 (yaklaşık 15 ondalık rakam duyarlık).

12f : Oniki bayt, -104932…-10-4932, 0, 10-4932…104932 (yaklaşık 18 ondalık rakam duyarlık).

16f : Onaltı bayt, -104932…-10-4932, 0, 10-4932…104932 (yaklaşık 33 ondalık rakam duyarlık).

Not: 16 bitlik ortamlar neredeyse tamamen kullanımdan kalkmıştır. Bir süre öncesine kadar yaygın olan 32 bitlik ortamlar da artık büyük oranda yerlerini 64 bitlik ortamlara bırakmıştır. Bu yüzden, bu kitapta temel olarak 64 bitlik ortamlar ele alınmıştır. 64 bitlik ortamlarda genelde short 2 bayt, long long 8 bayttır. Windows ortamlarda long 4 bayt, unix ortamlarda ise long 8 bayttır. Bu yüzden, örneğin Cygwin ortamında, normal cc komutu ile derlenen programlarda long 8 bayt olmasına rağmen, x86_64-w64-mingw32-gcc komutu ile derlenen programlarda long 4 bayt olmaktadır.

Tamsayılar ve kayan noktalı sayılar için her bilgisayarda farklı olabilecek bu özellikler, tam olarak limits.h ve float.h adlı başlık dosyalarında tanımlanmıştır. Birtakım varsayımlar yapmak yerine, bu başlık dosyalarında tanımlanmış bulunan değişmezlerin kullanılması özellikle önerilir. Başlık dosyaları için bir sonraki kısma ve ayrıca Bölüm 9’a bakınız.