Sabitler

Sabitler programca değiştirilemeyen değerlere denir. Sabitler farklı veri tiplerinde olabilirler. Şimdi bu tipleri inceleyelim:


Karakter Sabitleri

Karakter sabitleri tek karakteri ifade eden sabitlerdir. Misalen a ve % karakter sabitleridir. Karakter sabitleri iki tekli tırnak arasına yazılırlar: 'a', '%'.

char tipinde kullanılan karakterler 8 bitte depolanır. Fakat bazı karakterler (Misalen Türkçe, Almanca, Rusça) karakterler 16 bit yer de kaplayabilir. Bunlar için standart olmayan ama farklı bir kütüphanede tanımlanan wchar_t veri tipi kullanılabilir. İki karakter yan yana yazılarak da geniş karakter elde edilebilir. Misalen 'ab' bu şekilde elde edilmiş bir geniş karakterdir. 8 bitlik bir karakterin özellikle 16 bitte depolanması istenirse başına L konur, örneğin L'A'. wcahr_t veri tipi stddef.h kütüphanesinde tanımlıdır.

Bununla birlikte her karakterin bir sayısal karşılığı olduğu da unutulmamalıdır. Karakter sabitleri kullanılarak matematiksel işlemler yapılabilir ve int tipine de atama yapılabilir.

#include <stdio.h>
#include <stddef.h>

int main(void){
    wchar_t x='ab';
    long int y='c';
    long int z=(x+y)*L'd';
    printf("%d",z);
    return 0;
}

Kodu inceleyecek olursak önce x isminde bir geniş karakter değişkeni tanımlandığı görülür ve buna ilk değer olarak 'ab' verilmiştir. Karakterlerin sayısal değerlerinin karşılığına internette rahatça bulabileceğiniz bir ASCII tablosundan bakacak olursak a'nın değerinin 97 ve b'nin değerinin 98 olduğunu görürürüz. Bu değerler bellekte şu şekilde tutulur:

'a': 01100001
'b': 01100010

O zaman 'ab' geniş karakterimiz bellekte şöyle tutulacaktır:

'ab': 0110000101100010

İkili sistemdeki bu sayının onluk sistemdeki karşılığı 24930'dur. Ardından y isimli bir tam sayı değişkeni tanımlanmış ve bu değişkene ilk değer olarak 'c' atanmıştır. c'nin karşılığı 99'dur. Ardından bir z tam sayı değişkeni tanımlanmış ve ilk değer olarak da "(x+y)*'d'" atanmıştır. d'nin karşılığının 100 olduğunu göz önünde bulundurursak ve yukarıda bulduğumuz değerleri de kullanırsak bu değer "(24930+99) x 100"dür. Yani kısaca 2502900.

Son olarak z'nin değeri yazdırılmıştır. Sonuç yukarıdaki gibidir: 2502900.

Sayı yerine karakter kullanarak matematiksel işlemler yapmak pek kullanılan bir şey değildir. Yukarıdaki örnek sadece arka planın nasıl çalıştığını göstermek açısından verilmiştir.


Tam Sayı Sabitleri

Tam sayı sabitleri int, unsigned int, long int veya unsigned long int veri tiplerinden birine uydurulurlar. C99 standartları bunlara long long int ve unsigned long long int veri tiplerini de eklemiştir. Derleyici sayının sığabileceği en küçük veri tipini seçecek ve sayıyı ona uyduracaktır. Fakat bir sayı özellikle daha büyük bir veri tipine uydurulmak istenirse U ve L ekleri kullanılabilir. Örneğin 10 sayısını normalde koda yazdığınızda derleyici bunu otomatik olarak int tipine uydurur. Fakat bu özellikle long int tipinde depolanmak istenirse 10L şeklinde yazılmalıdır. Bu durumda baştaki bitler 0 ile doldurulacaktır. Ayrıca U ve L ekleri birlikte kullanılabilir. Bu durumda hangisinin önce geleceği önemli değildir. Bunlarla birlikte bir tam sayıyı long long integer tipine uydurmak için C99'la birlikte LL eki de eklenmiştir. Bu eklerin kullanımında büyük küçük harf duyarlılığı yoktur. "L" yerine "l", "U" yerine "u" da kullanılabilir.


Küsuratlı Sabitler

Küsuratlı sayılar ise normalde double tipine uydurulurlar. Daha az bellek kaplaması için float tipine uydurulmak istenirse sayının yanına F eki konmalıdır. Örneğin 123.23 sayısı double tipine uydurulurken 123.23F sayısı float tipine uydurulur.

Bu ekin kullanılmasında da büyük harf küçük harf duyarlılığı yoktur. Misalen 10.0F yerine 10.0f de yazılabilir.

Bir sayı özellikle neden başka bir veri tipinde tutulmak istenebilir? Bu soruyu şimdilik cevapsız bırakacağız. Fakat tip dönüşümleriyle ilgili kısımlara geldiğimizde konuyla alakalı birkaç örnek vereceğiz.


On Altılık ve Sekizlik Sabitler

Derleyicinin yazılan sayıyı sekizlik veya on altılık sayı sisteminde yorumlaması için de sabit çeşitleri vardır. 0xXX şeklinde yazılan sabitler on altılık sabitlerdir ve derleyici XX yerine yazılan sayıyı on altılık sistemde okur. 0XX şeklinde yazılan sabitler ise sekizlik sabitlerdir ve derleyici burada XX yerine yazılan sayıyı sekizlik sayı sisteminde okur. Örnek koda bakalım:

#include <stdio.h>

int main(void){
    int a=023+0xBF;
    printf("%d",a);
    return 0;
}

Programda önce bir a değişkeni tanımlanmış ve değeri 023+0xBF olarak belirlenmiştir. Sonra da a'nın değeri yazdırılmıştır. 23'ün sekizlik sistemdeki değeri 19'dur ve BF'nin 16'lık sistemdeki değeri 191'dir.  Bu nedenle çıktımız 210 olmalıdır ve kod çalıştırıldığında bunun böyle olduğu görülecektir.


Dizgi Sabitleri

Karakterler dizisinden oluşan sabitlerdir ve tırnak işaretleri arasında ifade edilirler:

Örnek:

"The value of a is: "
"a"

'a' ise dizgi sabiti değil karakter sabitidir.


Ters Eğik Çizgi Sabitleri

C'de bazı sabitlerin yazılışı önlerine ters eğik çizgi konularak yapılmıştır. Bunun nedeni kimi zaman bu sabitleri ifade edecek normal bir sabit olmaması kimi zaman da o sabitin normal halinin başka bir işlem için kullanılıyor olmasıdır.

Örneğin \n sabiti bir satır aşağı inmeye yaramaktadır. Bu sabit daha önceki örneklerde de kullanılmıştır. \b sabiti ise imleci bir karakter geri götürür. Bununla ilgili bir örnek yapalım:

#include <stdio.h>

int main(void){
    int a=200;
    printf("This is\na tee\bst\n");
    printf("%d\b",a);
    printf("%d",2*a);
    return 0;
}

Öncelikle bir a değişkeni tanımlanmış ve değeri 200 olarak atanmıştır. Sonrasında "This is" yazdırılmış, \n ile bir alt satıra geçilmiş, "a tee" yazdırılmış, \b ile bir karakter geri gidilmiş, "st" yazdırılmış (bir karakter geriden başlandığı için s harfi "tee"nin sonundaki e'nin yerine yazılmış), \n ile tekrar alt satıra geçilmiş, 200 değeri yazdırılmış, \b ile bir karakter geri gidilmiş ve "2 x 200" değeri yazdırılmıştır (yine bir karakter geriden başlandığı için 400'ün başındaki 4 rakamı 200'ün sonundaki sıfırın yerine yazılmıştır.). Sonuç şudur:

This is
a test
20400

Diğer ters eğik karakter sabitleri de şunlardır:

\f : Bir sonraki sayfaya gider.
\t : Yatay sekme oluşturur.
\v : Dikey sekme oluşturur.
\" : " işareti koyar.
\' : ' işareti koyar.
\a : Bip sesi çıkartır.
\? : Soru işareti koyar.
\\ : \ işareti koyar.
\r : Satır başına gider.
\N : N yerine yazılan sekizlik sistemdeki sayıya karşılık gelen karakteri yazdırır.
\xN: N yerine yazılan on altılık sistemdeki sayıya karşılık gelen karakteri yazdırır.