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 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 deger degismez bir ifadedir */
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şken”lerin 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) 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.

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.

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 8s
(signed) long long (int) -- 8s 8s
unsigned short (int) 2u 2u 2u
unsigned (int) 2u 4u 4u
unsigned long (int) 4u 4u 8u
unsigned long long (int) -- 8u 8u
float 4f 4f 4f
double 8f 8f 8f
long double 8f 12f/16f 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).

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 Kısım 8.5’e bakınız.)