Standart C Programlama Dili


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:

123ondalık 123
0123sekizli 123 (1×82+2×81+3) = ondalık 83
083geçersiz bir sayı
0x123onaltılı 123 (1×162+2×161+3) = ondalık 291
0XFFonaltı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şmez16 bit
ortam
32 bit
ortam
64 bit
ortam
12316 bit32 bit32 bit
123l32 bit32 bit64 bit
123L32 bit32 bit64 bit
07716 bit32 bit32 bit
077L32 bit32 bit64 bit
0xFFFF16 bit32 bit32 bit
0xFFFFL32 bit32 bit64 bit
0xFFFFF32 bit32 bit32 bit
0xFFFFFFFF32 bit32 bit32 bit
0xFFFFFFFFF(hata)64 bit64 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ı
\nyeni satır
\bgeri alma
\rsatırbaşı
\tdurak (tab)
\fsayfa ilerletme
\vdikey durak
\azil
\'tek tırnak
\"çift tırnak
\?soru işareti
\\ters bölü
\dddsekizli kodu ddd (1, 2 veya 3 adet sekizli rakam) olan karakter (Ek A’ya bakınız)
\xhhonaltı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.