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şken
lerin const
ile tanımlanmasının en azından iki avantajı vardır:
- 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.
- Ç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
ifadesinin değeri x+5
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.