1.2. Değişmezler
C dilinde, tamsayı, kayan noktalı, yani gerçek sayı, karakter ve karakter dizisi değişmezleri bulunur.
Tamsayı Değişmezleri
Tamsayı değişmezleri, program içinde, ondalık, sekizli veya onaltılı sayılar şeklinde belirtilebilirler ve derleyicinin tipine göre, 16, 32 veya 64 bit şeklinde saklanırlar. Aşağıdaki örneklerde bazı tamsayı değişmezleri görülmektedir:
123 | ondalık 123 |
0123 | sekizli 123 (1×82+2×81+3) = ondalık 83 |
083 | geçersiz bir sayı |
0x123 | onaltılı 123 (1×162+2×161+3) = ondalık 291 |
0XFF | onaltılı FF (15×161+15) = ondalık 255 |
Sayının önündeki bir sıfır rakamının, geri kalan rakamların sekizli
(yani, 0
-7
) ve sayı önündeki bir sıfırla onun
arkasından gelen küçük veya büyük x
harfinin, geri kalan
rakamların onaltılı (yani, 0
-9
,
A
-F
veya a
-f
) olması
gerektiğini gösterdiğine dikkat edin. Sayının program içindeki gösterimi ne
olursa olsun, makine içinde her zaman bitler halinde ikili sistemde saklanır;
ancak bu durum genelde programcıyı ilgilendirmez.
Bir tamsayı değişmezi, eğer değeri sığıyorsa (o sistem için doğal boy
olan) int
biçiminde, yoksa long
(uzun) biçiminde saklanır. Bir int
için doğal olan boy,
16 bitlik ortamlarda 16 bit, 32 ve 64 bitlik ortamlarda ise 32 bittir.
Bir long
ise 16 ve 32 bitlik ortamlarda 32 bit,
64 bitlik ortamlarda ise 64 bittir.
Tamsayı bir değişmezin uzun formda saklanmasını zorlamak için
değişmezin arkasına l
veya L
harfi eklenmelidir.
1
rakamı ile karıştırılmaması için,
küçük l
yerine büyük L
harfinin kullanılması
önerilir.
Bazı tamsayı değişmezleri ve bunların 16, 32 ve 64 bitlik ortamlardaki boyları aşağıda verilmiştir:
Değişmez | 16 bit ortam | 32 bit ortam | 64 bit ortam |
---|---|---|---|
123 | 16 bit | 32 bit | 32 bit |
123l | 32 bit | 32 bit | 64 bit |
123L | 32 bit | 32 bit | 64 bit |
077 | 16 bit | 32 bit | 32 bit |
077L | 32 bit | 32 bit | 64 bit |
0xFFFF | 16 bit | 32 bit | 32 bit |
0xFFFFL | 32 bit | 32 bit | 64 bit |
0xFFFFF | 32 bit | 32 bit | 32 bit |
0xFFFFFFFF | 32 bit | 32 bit | 32 bit |
0xFFFFFFFFF | (hata) | 64 bit | 64 bit |
32 bit ortamın son örneğinde—özellikle 32 bit ortamlar için önem
taşıyan—64 bitlik long long
(uzun uzun tamsayı)
biçimi kullanılmıştır. Daha kısa bir tamsayı değişmezinin
long long
biçimde saklanmasını sağlamak için
ll
veya LL
eki kullanılabilir.
64 bit ortamlarda long
ve long long
tipleri aynı uzunlukta, yani 64 bit, oldukları için, iki tip arasında
bir fark yoktur.
Bir sekizli veya onaltılı tamsayı değişmezi, daha büyük bir
bellek alanına yerleştirildiği zaman, soluna sıfır konulur. Yani böyle
değişmezlerin işaretsiz olduğu varsayılır. Ondalıklı bir tamsayı değişmezinin
işaretsiz olarak işlem görmesini sağlamak için arkasına u
veya
U
eki konulmalıdır, örneğin 65000U
.
Yukarıdaki tabloda verilen bilgilerin kullandığımız sistemler için genel olarak geçerli olduğunu, ancak gerçeklemeden gerçeklemeye farklılık göstereceğini unutmayın. Daha detaylı bilgiler kitabın sonuna doğru verilmektedir.
Kayan Noktalı Sayı Değişmezleri
Kayan noktalı sayı değişmezleri ya tamsayı ile kesir kısmı arasına nokta konarak yada bilimsel gösterimde belirtilirler. İkinci yöntem, genelde, çok büyük veya çok küçük sayılar için kullanılır. Aşağıda bazı örnekler vardır:
1.123 | |
1.23E20 | = 1.23×1020 |
1.23e20 | = 1.23×1020 (büyük veya küçük harf olabilir) |
123E18 | = 1.23×1020 |
1.23E-20 | = 1.23×10-20 |
Değişmezin içinde herhangi bir boşluğun olmaması gerektiğine dikkat edin. C Standardına nispeten yeni bir ekleme olan onaltılı kayan noktalı değişmezler ile ilgili bilgiler Kısım 8.6’da verilmiştir.
Normalde, kayan noktalı değişmezler 8 baytta, yani
double
(çift) duyarlıkta, saklanır. Eğer kayan
noktalı değişmezde f
veya F
eki bulunuyorsa,
o zaman 4 baytta, yani tek duyarlıkta; eğer l
veya
L
eki kulanılırsa, o zaman gerçeklemeye göre 8, 12 veya 16
baytta, yani long double
(uzun çift veya dörtlü)
duyarlıkta saklanır. Bu değerler gerçeklemeden gerçeklemeye farklılık
gösterebilir.
Karakter Değişmezleri
Bir karakter değişmezi,
'A'
, 'a'
, '%'
gibi tırnak işaretleri
arasına konulan tek bir karakter veya tek bir karaktere eşdeğer olan bir kaçış
sırasıdır. Bir kaçış sırası
bir ters bölü işareti ile bir harf veya rakamlardan oluşur. C dilinde sadece
şu kaçış sıraları kullanılır:
Kaçış sırası | Anlamı |
---|---|
\n | yeni satır |
\b | geri alma |
\r | satırbaşı |
\t | durak (tab) |
\f | sayfa ilerletme |
\v | dikey durak |
\a | zil |
\' | tek tırnak |
\" | çift tırnak |
\? | soru işareti |
\\ | ters bölü |
\ddd | sekizli kodu ddd (1, 2 veya 3 adet sekizli rakam) olan karakter (Ek A’ya bakınız) |
\xhh | onaltılı kodu hh (herhangi bir sayıda onaltılı rakam) olan karakter (Ek A’ya bakınız) |
Ek olarak, aşağıda bazı karakter değişmezleri örnekleri vardır:
'\0' | boş karakter |
'\'' | bir karakter değişmezi olarak tek tırnak |
'\"' | bir karakter değişmezi olarak çift tırnak |
'\\' | bir karakter değişmezi olarak ters bölü |
'\101' | sekizli kodu 101 olan karakter (ASCII sisteminde 'A' harfi) |
'\x041' | onaltılı kodu 41 olan karakter (ASCII sisteminde 'A' harfi) |
Bir karakter değişmezinin tipi int
’tir.
Karakterler ise tipik olarak bir baytta (8 bit) saklanır ve tamsayı gibi
işlem görürler. Ancak signed
(işaretli) veya
unsigned
(işaretsiz) oldukları veya kullanılan
kodlama sistemi C Standardında belirtilmemiştir. Bizim sistemlerimizde,
ASCII kodlama sistemi kullanılır. Normal karakterlerin (örneğin,
sistemimizdeki 7 bitlik ASCII karakterlerinin) işaretsiz oldukları garanti
edilmiştir. Gerektiğinde, bir karakter değişkeninin işaretli olup olmadığı
programcı tarafından açıkça belirtilmelidir.
Karakter Dizisi Değişmezleri
Bir
karakter dizisi değişmezi
çift tırnaklar arasında yazılmış herhangi bir sayıda karakter veya yukarıda
listesi verilmiş kaçış sırasından oluşur. İşte bazı örnekler. Son örnekteki,
yeni satır (\n
) ve tek tırnak (\'
) kaçış sıralarına
dikkat edin.
"" | boş karakter dizisi |
"Merhaba" | 7 karakterlik bir karakter dizisi |
"Isminizi girin,\nveya ENTER\'a basin" | iki satırdan oluşan bir karakter dizisi |
Bir karakter dizisi değişmezi bellekte saklandığı zaman, dizinin
sonuna otomatik olarak boş karakter (\0
) eklenir;
bundan dolayı diziyi saklamak için kullanılan bayt sayısı dizinin
uzunluğundan bir fazladır. Örneğin, yukarıdaki örnekleri saklamak için
kullanılan bellek miktarı sırasıyla 1, 8 ve 35 bayttır.
Bir program içinde, aralarına hiçbir işaret koymadan peşpeşe yazılan karakter dizisi değişmezleri birleştirilir ve tek bir dizi değişmezi olarak alınırlar. Diziler, bazı sistemlerde, salt-okunur belleğe yerleştirilebilirler, bu da onları değiştirilemez kılabilir. Ayrıca, birbirine tıpatıp benzeyen iki veya daha fazla karakter dizisi aynı bellek bölgesinde saklanabilir.
Sisteminizde kullanılan karakter kodlamasında bulunan herhangi bir karakteri kullanabilirsiniz; ancak, ASCII-dışı karakterler için program gerçeklemeden gerçeklemeye farklı şeyler görüntüleyebilir. Örneğin, sistemler arasındaki uyumsuzluklardan kaçınmak için, bu kitaptaki bazı karakter dizisi değişmez örneklerinde ASCII karakter kümesinde olmayan Türkçe karakterler kullanılmamıştır.
Bu kitabın büyük bir bölümünde, yukarıda anlatıldığı gibi, tek baytlık ve hatta 7 bitlik ASCII karakter ve karakter dizileri kullanılmasına rağmen, özellikle İngilizce olmayan diller için yazılmış programlarda çokbaytlı veya geniş karakterler ve karakter dizileri kullanılır. Bunlar hakkında genel bilgi için Kısım 8.2’ye ve ayrıca Ek A’ya bakınız.
Bir Sonraki Satıra Devam Etme
Bir deyim veya karakter dizisi değişmezi
programın tek bir satırına sığmıyorsa ve bir sonraki satıra devam etmek
gerekiyorsa, satırın sonuna ters bölü (\
) işareti konup bir
sonraki satıra devam edilebilir. Ayrıca, yukarıda da anlatıldığı gibi,
uzun bir karakter dizisi değişmezi iki satırda iki ayrı karakter dizisi
şeklinde de yazılabilir. Örneğin, birbirine eşdeğer olan aşağıdaki
iki yazım şekli, 54 karakterlik bir karakter dizisi değişkeni ifadesidir:
"Bir sonraki satira devam eden " "uzun bir karakter dizisi" | İki satırda yazılan iki ayrı karakter dizisi, derleyici tarafından birleştirilip, tek bir karakter dizisi gibi işlenir. |
"Bir sonraki satira devam eden \ uzun bir karakter dizisi" | İki satırda yazılan tek bir karakter dizisi için ilk satırının sonuna
mutlaka \ işareti konmalıdır. Eğer ikinci satırın başında boşluk
bırakılırsa, bu boşluklar karakter dizisinin bir parçası olur. |
C dilinde (program kaynak kodunda) yeni satır karakteri boşluk karakteri gibi işlem gördüğünden ve deyimler içinde birçok yerde boşluk karakterleri kullanabileceğiniz için, yukarıda bahsedilen devam etme mekanizmasına genelde pek gerek duyulmaz. Sadece önişlemci emirlerinde bu yöntemi kullanmanız gerekir.