SABİTLER
Veriler ya nesnelerin içerisinde ya da doğrudan sabit biçiminde bulunurlar. Sabitler nesne
biçiminde olmayan, programcı tarafından doğrudan girilen verilerdir. Sabitlerin sayısal
değerleri derleme zamanında tam olarak bilinmektedir. Örneğin :
x = y + z;
ifadesi bize a ve b içindeki sayıların toplanacağı ve c’ye aktarılacağını anlatır. Oysa
d = x + 10;
ifadesinde x değiskeni içinde saklanan değer ile 10 sayısı toplanmıstır. Burada 10 sayısı
herhangi bir değiskenin içindeki değer değildir, doğrudan sayı biçiminde yazılmıstır. Nesnelerin
türleri olduğu gibi sabitlerin de türleri vardır. Nesnelerin türleri daha önce gördüğümüz gibi
bildirim yapılırken belirlenir. Sabitlerin türlerini ise derleyici, belirli kurallar dahilinde sabitlerin
yazılıs biçimlerinden tespit eder. Sabitlerin türlerini bilmek zorundayız, çünkü C dilinde
sabitler, değiskenler ve operatörler bir araya getirilerek (kombine edilerek) ifadeler
(expressions) olusturulur. Daha sonra detaylı göreceğimiz gibi C dilinde ifadelerin de bir türü
vardır ve ifadelerin türleri, içerdikleri sabit ve değiskenlerin türlerinden elde edilir. O halde
sabit türlerini detaylı olarak inceleyelim :
Tamsayı Sabitleri (integer constants)
Đsaretli Tamsayı Sabitleri (signed int) :
Bunlar tipik olarak int türden değiskenlerine atanan ve tamsayı biçiminde olan sabitlerdir,
yazılırken herhangi bir ek almazlar. C’de int türü sınırları içinde olan her tamsayı birer tamsayı
sabit (ya da int türden sabit ) olarak ele alınır.
-25
30000
25789
-320
0
sayılarının hepsi isaretli tamsayı (signed int) sabiti olarak ele alınırlar, çünkü int türü sayı
sınırları içinde bulunuyorlar ve sonlarında herhangi bir ek bulunmuyor.
int türü sistem bağımlıdır ve int sabitleri de sistemden sisteme değisebilir.
sistem uzunluk sınır değerler
DOS, WINDOWS 3.1 2 byte – 32768, + 32767
UNIX WINDOWS 95 4 byte -2147483648, +2147483647
Örneğin 425000 Dos’ta int sabiti değildir ama UNIX’te int sabittir.
Uzun Tamsayı Sabitleri(Long integer constants)
Uzun Tamsayı Sabitleri
Đsaretli Uzun Tamsayı Sabitleri (signed long)
long türden sabitler iki türlü ifade edilirler :
1. long int türünün sayı sınırları içinde bulunan bir sayının sonuna L ya da l yazarak.
Bu durumda derleyiciler ilgili sayı int sınırları içinde olsa da long sabit olarak ele alır.
6 . BÖLÜM :
36
22345l long sabittir. çünkü sonunda l eki var.
0l, -23465L, 325l long sabitlerdir.
long sabit kullanımında algılanması daha kolay olduğu için L soneki tercih edilmelidir. l
soneki 1 rakamıyla görünüm açısından çok benzediği için karısıklığa neden olabilir.
2. int türün sayı sınırlarını asan fakat long int türü sayı sınırları içinde kalan her tamsayı
doğrudan long int türden sabit olarak ele alınır. Bu durum doğal olarak, DOS gibi int ve
long türlerinin birbirinden farklı olduğu sistemlerde anlamlıdır.
Örneğin DOS’da
325000
-33333
1278902
long türden sabitlerdir. Oysa 32 bitlik sistemlerde long türünün uzunluğuyla int türün
uzunluğu aynı (4 byte) olduğu için bu sayılar int sabiti olarak ele alınacaktır. Bu
sistemlerde yukarıdaki sayıları long sabit olarak ele almak istersek sonlarına l ya da L
eklememiz gerekmektedir.
Karakter Sabitleri (char)
char sabitleri tipik olarak char türden nesnelere atanan sabitlerdir. (Böyle bir zorunluluk yok.)
char türden sabitler C dilinde dört ayrı biçimde bulunabilirler.
1. Đstenilen bir karakter tek tırnak (single quote) içerisinde kullanılırsa char türden sabit
olarak ele alınır. Örnek :
‘a’
‘J’
‘Ç’
‘:’
’8′
‘<'
Yukarıdaki gösterimlerin herbiri birer char türden sabitidir.
C'de tek tırnak içerisinde belirtilen char sabitleri, aslında o karakterin karakter setindeki
(örneğin ASCII tablosundaki) sıra numarasını gösteren bir tamsayıdır.
{
char ch;
ch = 'a';
...
}
Bu örnekte aslında ch isimli char türden değiskene a karakterinin ASCII tablosundaki sıra
numarası olan 97 sayısı aktarılmaktadır. Tek tırnak içindeki karakter sabitlerini görünce
aslında onların küçük birer tamsayı olduğunu bilmeliyiz. Çünkü bellekte karakter diye
birsey yoktur hersey ikilik sistemde 1 ve 0 lardan olusan sayılardır. Yukarıdaki örnekte
istersek ch değiskenine asağıdaki gibi bir atama yapabiliriz:
ch = 'a' + 3;
Bu durumda ch değiskenine sayısal olarak 100 değeri atanacaktır. Bu sayıya da ASCII
tablosundaki 'd' karakteri karsılık gelir.
2. Önceden tanımlanmıs ters bölü karakter sabitleri (escape sequences)
Yukarıda tanımlanan yöntemde ekrana basılamayan yani ekranda görüntü olusturmayan
(non printable) karakterleri ifade edemeyiz. Örneğin çan karakteri (çan sesi) ya da ters
bosluk (backspace) karakteri ekrana basılamaz. Tek tırnak içindeki ters bölü (back slash)
SABİTLER
37
karakterinden sonra yer alan bazı karakterler çok kullanılan ancak basılamayan bazı
karakterlerin yerlerini tutarlar. Bunların listesi asağıda verilmistir:
Önceceden Tanımlanmıs Ters Bölü Karakter Sabitleri (Escape Sequences)
Tanım ASCII No
‘ ′ ‘x0′ ‘ ′ NULL karakter 0
‘a’ ‘x7′ ‘ 7′ çan sesi (alert) 7
‘b’ ‘x8′ ‘ 10′ geri bosluk (back space) 8
‘t’ ‘x9′ ‘ 11′ tab karakteri (tab) 9
‘n’ ‘xA’ ‘ 12′ asağı satır (new line) 10
‘v’ ‘xB’ ‘ 13′ düsey tab (vertical tab) 11
‘f’ ‘xC’ ‘ 14′ sayfa ileri (form feed) 12
‘r’ ‘xD’ ‘ 15′ satır bası (carriage return) 13
‘”‘ ‘x22′ ‘ 42′ çift tırnak (double quote) 34
‘\’ ‘x5C’ ‘134′ ters bölü (back slash) 92
kullanılıslarına bir örnek :
{
char ch;
ch = ‘a’;
}
3. 16′lık (hexadecimal) sayı sisteminde tanımlanmıs karakter sabitleri
Tek tırnak içinde tersbölü ve x karakterlerinden sonra bir hex sayı verilirse bu ASCII
tablosundaki o sayısal değerin gösterdiği sıra numarasındaki karaktere isaret eden bir
karakter sabitidir.
‘x41′ /* 41H numaralı ASCII karakteridir. */
‘xff’ /* FFH numaralı ’2′ karakter sabitidir. */
‘x1C’ /* 1C numaralı ASCII karakter sabitidir. */
Küçük “x” yerine büyük harfle “X” yazmak C’nin ilk klasik versiyonunda kabul ediliyordu
simdi artık geçerli değildir. Örnek :
{
char harf;
harf = ‘x41′;
}
Yukarıdaki örnekte harf isimli char türden değiskene 41H ASCII sıra no.lu karakter
atanmıstır. Bu da desimal sistemdeki 65 sayısına esittir. 65 sıra nolu ASCII karakteri ‘A’
karakteridir. Dolayısıyla harf isimli değiskene ‘A’ atanmıstır.
4. 8′lik (octal) sayı sistemde tanımlanmıs karakter sabitleri
Tek tırnak içinde tersbölü karakterinden sonra bir oktal sayı yazılırsa bu kullanılan karakter
setindeki o sayısal değerin gösterdiği sıra numarasındaki karaktere isaret eden bir karakter
sabitidir. Tek tırnak içindeki ters bölü karakterini izleyen sayı üç basamaktan uzun
olmamalıdır. Sekizlik sayıların yazımında olduğu gibi sayının basında sıfır olma zorunluluğu
yoktur. Bu sekilde yazılabilecek en büyük karakter sabiti ‘377′ dir.:
‘ 12′ /* 10 numaralı ASCII karakteri, Tam sayı değeri 10 */
‘16′ /* 14 numaralı ASCII karakteri. Tam sayı değeri 14 */
‘123′ /* 83 numaralı ASCII karakteri. Tam sayı değeri 83 */
Program içinde kullanımına bir örnek:
{
char a, b;
a = ‘xbc’ ; /* hex sistemde tanımlanmıs char sabit */
b = ‘ 12′; /* oktal sistemde tanımlanmıs bir char sabit */
}
7 numaralı ASCII karakteri olan çan karakterini sabit olarak 3 biçimde de yazabiliriz.
‘x7′ /* hex gösterimli karakter sabiti */
‘ 7′ /* oktal gösterimli karakter sabiti */
‘a’ /* önceden belirlenmis ters bölü karakter sabiti */
Burada tercih edilecek biçim son biçim olmalıdır.Hem tasınabilir bir biçimdir hem de
okunabilirliği daha iyidir. Baska karakter setlerinde çan sesi karakteri 7 sıra numaralı
karakter olmayabilir ama önceden belirlenmis ters bölü karakter sabiti seklinde ifade
edersek hangi sistem olursa olsun çan sesi karakterini verecektir. Ayrıca kodu okuyan kisi
çan sesi karakterinin 7 numaralı ASCII karakteri olduğunu bilmeyebilir ama C programcısı
olarak ‘a’ nın çan sesi karakteri olduğunu bilecektir.
Karakter sabitleri konusunu kapatmadan önce karakter setleri konusunda da biraz bilgi
verelim:
Günümüzde kullanılan en popüler karakter seti ASCII karakter setidir. ASCII (American
Standard Code for Information Interchange) sözcüklerinin basharflerinden olusan bir
kısaltmadır. ASCII setinin orjinal versiyonunda karakterler 7 bitlik bir alanda kodlanmıstır. Bazı
bilgisayarlar ise 8 bit alana genisletilmis ASCII seti kullanırlar ki bu sette 128 yerine 256
karakter temsil edilebilmektedir. Farklı bilgisayarlar farklı karakter setleri kullanabilmektedir.
Örnek olarak IBM mainframe’leri daha eski bir set olan EBCDIC seti kullanırlar. Unicode ismi
verilen daha gelistirilmis bir karakter seti vardır ki karakterler 2 byte alanda temsil edildikleri
için bu sette 65.536 farklı karakter yer alabilmektedir. Gelecekte bir çok makinanın bu karakter
setini destekleyecek biçimde tasarlanacağı düsünülmektedir.
Đsaretsiz türlere iliskin sabitler
Đsaretsiz türlere iliskin sabitler onların isaretli biçimlerinin sonuna u ya da U getirilmesiyle elde
edilirler.
-15000 (signed) int sabit
15000U (unsigned) int sabit.
1200L (signed) long sabit
1200Lu (unsigned) long sabit.
Sonek olarak kullanılan l, L, u ve U harflerinin sırası önemli değildir.
123ul
123UL
123Lu
123lu
Yukarıdaki hepsi geçerli birer uzun tamsayı (unsigned long int) sabittir.
Tamsayı sabitlerinin 16′lık ve 8′lik sistemlerde gösterilmesi
C’de tamsayı sabitleri (char, int, long) 10′luk sistemin yanısıra 16′lık ve 8′lik sistemlerde de
yazılabilirler. Bu sayı sistemleriyle yazılmıs tamsayı sabit türleri için yukarıda verilen kurallar
aynen geçerlidir. Çünkü bir sayıyı 16′lık ya da 8′lik sistemde yazmakla onun yalnızca
görünümünü değistirmis oluruz. Sabit türleri gösterim biçimiyle değil nicelikle iliskilidir. C
dilinde ikilik sayı sisteminde sabitlerin yazılması söz konusu değildir.
SABİTLER
16′lık sistemde gösterim 0Xbbb.. biçimindedir. (b karakterleri basamakları gösteriyor, 9′dan
büyük basamak değerleri için A, B, C, D, E, F karakterleri ya da a, b, c, d, e, f karakterleri
kullanılabilir.
8′lik sistemde ise 0bbb.. biçimindedir. (nadir olarak kullanılır). Örnekler:
0×12 sayısı hex gösterimli bir tamsayı (int) sabit.
0X12L sayısı hex gösterimli bir uzun tamsayı (long) sabit.
0x1C205470 hex gösterimli bir uzun tamsayı (long) sabit. Çünkü (DOS’da) tamsayı sayı
sınırını asmaktadır.
0x1934ul hex gösterimli isaretsiz uzun tamsayı (unsigned long) sabittir.
01234 oktal gösterimli tamsayı (int) sabit
0567L oktal gösterimli uzun tamsayı (long) sabit
0777U oktal gösterimli isaretsiz tamsayı (unsigned int) sabit
0452Lu oktal gösterimli (unsigned long) sabit.
Sabitler yukarıda gösterildiği gibi her üç sayı sisteminde de yazılabilir, hatta bir ifade içinde
kullanılan sabitler farklı sayı sistemlerinde de yazılmıs olabilirler, bu derleme zamanında error
olusturacak bir neden olmayıp tamamen legaldir.
…
int x;
x = 0x1AC2 + 345 + 01234;
Gerçek Sayı Sabitleri (floating Constants)
1. float türden sabitler
Nokta içeren ve sonuna f ya da F getirilmis sabitler float türden sabitler olarak ele alınırlar.
Örneğin:
1.31F
10.F
-2.456f
float türden sabitlerdir.
Not : Klasik C’de, yani C dilinin standartlastırılmasından önceki dönemde float türden bir
sabit elde etmek için, sayının sonuna f eki alması yeterliydi yani nokta içermesi
gerekmiyordu ama standartlarda yapılan değisiklikle artık float sabitlerin sonuna ek gelse
de mutlaka nokta içermeleri gerekiyor. Yani derleyiciler 3f seklinde bir yazımı derleme
zamanında bir hata (error) mesajıyla bildiriyorlar.
2. double türden sabitler
Sonuna f ya da F eki almamıs nokta içeren sabitler ile float duyarlığını asmıs sabitler
double sabitler olarak değerlendirilirler. Örneğin :
-24.5 double türden sabittir.
3. long double türden sabitler
long double türden sabitler noktalı ya da üstel biçimdeki sayıların sonuna l ya da L
getirilerek elde edilirler :
1.34L
10.2L
long double türden sabitlerdir.
Gerçek Sayı Sabitlerinin Üstel Biçimde Gösterilmesi
Gerçek sayı sabitleri üstel biçimde de ifade edilebilirler, bunun için sayının sonuna e ya da E eki
getirilerek bir tamsayı yazılır. Bu, sayının 10x gibi bir çarpanla çarpıldığını gösterir.