Hazır Değerler
Programlar işlerini değişkenlerin ve nesnelerin değerlerini kullanarak yaparlar. Değişkenleri ve nesneleri işleçlerle ve işlevlerle kullanarak yeni değerler üretirler ve yeni nesneler oluştururlar.
Bazı değerlerin ise hesaplanmaları gerekmez; onlar kaynak kod içine doğrudan hazır olarak yazılırlar. Örneğin şu kod parçasındaki işlemler sırasında kullanılan 0.75
kesirli sayı değeri ve "Toplam fiyat: "
sabit dizgisi kod içine programcı tarafından hazır olarak yazılmıştır:
öğrenciFiyatı = biletFiyatı * 0.75;
fiyat += öğrenciSayısı * öğrenciFiyatı;
writeln("Toplam fiyat: ", fiyat);
Bu tür değerlere hazır değer denir. Şimdiye kadar gördüğümüz programlarda zaten çok sayıda hazır değer kullandık. Bu bölümde hazır değerlerin bütün çeşitlerini ve söz dizimlerini göreceğiz.
Tamsayılar
Tamsayıları dört değişik sayı sisteminde yazabilirsiniz: Günlük hayatımızda kullandığımız onlu sayı sisteminde, bazı durumlarda daha uygun olan on altılı veya ikili sayı sistemlerinde, ve nadir olarak sekizli sayı sisteminde.
Bütün tamsayı değerlerinin rakamlarının aralarına, istediğiniz sayıda, istediğiniz yerlerine, ve herhangi amaçla; örneğin okumayı kolaylaştırmak için _
karakterleri yerleştirebilirsiniz. Örneğin, rakamları üçer üçer ayırmak için: 1_234_567
. Bu karakterler tamamen programcının isteğine bağlıdır ve derleyici tarafından gözardı edilirler.
Onlu sayı sisteminde: Günlük hayatımızda kullandığımız gibi, onlu rakamlarla yazılır. Örnek: 12
. Onlu değerlerin ilk rakamı 0 olamaz. Bunun nedeni, 0 ile başlayan hazır değerlerin çoğu başka dilde sekizli sayı sistemine ayrılmış olmasıdır. Bu konudaki karışıklıklardan doğabilecek olan hataları önlemek için D'de tamsayı hazır değerleri 0 ile başlayamaz.
On altılı sayı sisteminde: 0x
veya 0X
ile başlayarak ve on altılı sayı sisteminin rakamları olan "0123456789abcdef" ve "ABCDEF" ile yazılır. Örnek: 0x12ab00fe
.
Sekizli sayı sisteminde: std.conv
modülündeki octal
ile ve sekizli sayı sisteminin rakamları olan "01234567" ile yazılır. Örnek: octal!576
.
İkili sayı sisteminde: 0b
veya 0B
ile başlayarak ve ikili sayı sisteminin rakamları olan 0 ve 1 ile yazılır. Örnek: 0b01100011
.
Tamsayı değerlerin türleri
Her değerin olduğu gibi, D'de hazır değerlerin de türleri vardır. Hazır değerlerin türleri int
, double
, vs. gibi açıkça yazılmaz; derleyici, türü hazır değerin yazımından anlar.
Hazır değerlerin türlerinin aslında programcı açısından çok büyük bir önemi yoktur. Bazen tür, hazır değerin içinde kullanıldığı ifadeye uymayabilir ve derleyici uyarı verir. Öyle durumlarda aşağıdaki bilgilerden yararlanarak hazır değerin türünü açıkça belirtmeniz gerekebilir.
Tamsayı hazır değerlerin öncelikle int
türünde oldukları varsayılır. Eğer değer bir int
'e sığmayacak kadar büyükse, derleyici şu şekilde karar verir:
int
'e sığmayacak kadar büyük olan değer onlu sistemde yazılmışsa,long
'durint
'e sığmayacak kadar büyük olan değer başka bir sayı sisteminde yazılmışsa, öncelikleuint
'tir, ona da sığmıyorsalong
'dur, ona da sığmıyorsaulong
'dur
Bunu görmek için daha önce öğrendiğimiz typeof
'tan ve stringof
'tan yararlanan şu programı kullanabiliriz:
import std.stdio; void main() { writeln("\n--- bunlar onlu olarak yazıldılar ---"); // int'e sığdığı için int writeln( 2_147_483_647, "\t\t", typeof(2_147_483_647).stringof); // int'e sığmadığı ve onlu olarak yazıldığı için long writeln( 2_147_483_648, "\t\t", typeof(2_147_483_648).stringof); writeln("\n--- bunlar onlu olarak yazılMAdılar ---"); // int'e sığdığı için int writeln( 0x7FFF_FFFF, "\t\t", typeof(0x7FFF_FFFF).stringof); // int'e sığmadığı ve onlu olarak yazılmadığı için uint writeln( 0x8000_0000, "\t\t", typeof(0x8000_0000).stringof); // uint'e sığmadığı ve onlu olarak yazılmadığı için long writeln( 0x1_0000_0000, "\t\t", typeof(0x1_0000_0000).stringof); // long'a sığmadığı ve onlu olarak yazılmadığı için ulong writeln( 0x8000_0000_0000_0000, "\t\t", typeof(0x8000_0000_0000_0000).stringof); }
Çıktısı:
--- bunlar onlu olarak yazıldılar --- 2147483647 int 2147483648 long --- bunlar onlu olarak yazılMAdılar --- 2147483647 int 2147483648 uint 4294967296 long 9223372036854775808 ulong
L
son eki
Değerin büyüklüğünden bağımsız olarak, eğer değerin sonunda bir L
karakteri varsa, türü long
'dur. Örnek: 10L
.
U
son eki
Değerin büyüklüğünden bağımsız olarak, eğer değerin sonunda bir U
karakteri varsa, işaretsiz bir türdür. Örnek: 10U
'nun türü uint
'tir. Küçük harf u
da kullanılabilir.
L
ve U
karakterleri birlikte ve sıralarının önemi olmadan da kullanılabilirler. Örneğin 7UL
'nin ve 8LU
'nun ikisinin de türleri ulong
'dur.
Kesirli sayılar
Kesirli sayılar onlu sayı sisteminde veya on altılı sayı sisteminde yazılabilirler. Örneğin onlu olarak 1.234
veya on altılı olarak 0x9a.bc
.
Onlu sayı sisteminde: Sayının yanına, e
veya E
belirtecinden sonra "çarpı 10 üzeri" anlamına gelen bir çarpan eklenebilir. Örneğin 3.4e5
, "3.4 çarpı 10 üzeri 5" anlamındadır. Bu belirteçten sonra bir +
karakteri de yazılabilir ama onun bir etkisi yoktur. Örneğin, 5.6e2
ile 5.6e+2
aynı anlamdadır.
Belirteçten sonra gelen -
karakterinin etkisi vardır ve "10 üzeri o kadar değere bölünecek" anlamına gelir. Örneğin 7.8e-3
, "7.8 bölü 10 üzeri 3" anlamındadır.
On altılı sayı sisteminde: Sayı 0x
veya 0X
ile başlar; noktadan önceki ve sonraki bölümleri on altılı sayı sisteminin rakamlarıyla yazılır. e
ve E
de on altılı sistemde geçerli rakamlar olduklarından, üs belirteci olarak başka bir harf kullanılır: p
(veya P
).
Başka bir fark, bu belirteçten sonra gelen değerin "10 üzeri" değil, "2 üzeri" anlamına gelmesidir. Örneğin 0xabc.defP4
'ün sonundaki belirteç, "2 üzeri 4 ile çarpılacak" anlamına gelir.
Kesirli sayı değerler hemen hemen her zaman için bir nokta içerirler, ama belirteç varsa noktaya gerek yoktur. Örneğin 2e3
, 2000 değerinde bir kesirli sayıdır.
Noktadan önceki değer 0
ise yazılmayabilir. Örneğin .25
, "çeyrek" anlamında bir kesirli sayı değeridir.
Gözardı edilen _
karakterlerini kesirli sayılarla da kullanabilirsiniz: 1_000.5
Kesirli sayı değerlerin türleri
Kesirli değerler özellikle belirtilmemişse double
türündedir. Sonlarına f
veya F
eklenirse, float
; L
eklenirse real
olurlar. Örneğin 1.2
double
'dır, 3.4f
float
'tur, ve 5.6L
real
'dir.
Karakterler
Karakter türündeki hazır değerler her zaman için tek tırnaklar arasında yazılırlar. Örneğin 'a'
, '\n'
, '\x21'
.
Karakterin kendisi olarak: Tek tırnaklar arasına karakterin kendisi klavyeden yazılabilir veya başka bir metinden kopyalanabilir: 'a'
, 'ş'
, vs.
Kontrol karakteri olarak: Ters bölü işaretinden sonra bir karakter belirteci kullanılabilir. Örneğin ters bölü karakterinin kendisi '\\'
şeklinde yazılır. Kontrol karakterleri şunlardır:
Yazımı | Anlamı |
---|---|
\' | tek tırnak |
\" | çift tırnak |
\? | soru işareti |
\\ | ters bölü |
\a | uyarı karakteri (bazı ortamlarda zil sesi) |
\b | silme karakteri |
\f | sayfa sonu |
\n | satır sonu |
\r | aynı satırın başına götürür |
\t | bir sonraki sekme adımına götürür |
\v | bir sonraki düşey sekme adımına götürür |
Genişletilmiş ASCII karakter kodu olarak: Karakterleri doğrudan kodları ile belirtebilirsiniz. Yukarıda tamsayılar başlığında anlatılanlara uygun olarak, kodu \x
ile başlayan 2 haneli on altılı sayı olarak veya \
ile başlayan 3 haneye kadar sekizli sayı olarak yazabilirsiniz. Örneğin '\x21'
ve '\41'
ünlem işareti karakterinin iki farklı yazımıdır.
Unicode karakter kodu olarak: u
karakterinden sonra 4 on altılı rakam olarak yazılırsa türü wchar
olur; U
karakterinden sonra 8 on altılı rakam olarak yazılırsa türü dchar
olur. Örneğin '\u011e'
ve '\U0000011e'
Ğ karakterinin sırasıyla wchar
ve dchar
türünde olan değeridir.
İsimli karakter olarak: İsimleri olan karakterleri isimleriyle ve '\&karakter_ismi;'
söz dizimiyle yazabilirsiniz. D, HTML 5 karakter isimlerinin hepsini destekler. Örneğin '\€'
€, '\♥'
♥, ve '\©'
de © karakteridir.
Dizgiler
Hazır dizgiler sabit karakterlerin bileşimlerinden oluşurlar ve çok sayıda farklı söz dizimiyle yazılabilirler.
Çift tırnaklar arasında yazılan dizgiler
Dizgilerin başka dillerde de bulunan en yaygın yazımı, çift tırnaklar arasında yazılmalarıdır: örneğin "merhaba"
. Bu şekilde yazıldığında, içindeki karakterler yukarıdaki karakter yazımlarına uygun olarak yazılırlar. Örneğin, göstermek amacıyla yukarıdaki karakter sabitlerinden bazılarını içeren "A4 ka\u011fıt: 3\½TL"
dizgisi, "A4 kağıt: 3½TL"
nin eşdeğeridir.
Göründüğü gibi çıkan dizgiler
Ters tırnak işaretleri arasında yazılan dizgilerin içindeki karakterler, yukarıda karakter sabitleriyle ilgili olarak anlatılan kurallar işletilmeden, görüldükleri anlama gelirler. Örneğin `c:\nurten`
şeklinde yazılan dizgi, Windows işletim sisteminde bir klasör ismi olabilir. Oysa çift tırnaklar arasında yazılmış olsa, dizginin içinde geçen '\n'
, satır sonu anlamına gelirdi:
writeln(`c:\nurten`); writeln("c:\nurten");
c:\nurten ← göründüğü gibi c: ← satır sonu olarak anlaşılan karakter urten
Göründüğü gibi çıkan dizgilerin diğer bir yazım şekli, çift tırnaklar kullanmak, ama öncesine bir r
belirteci eklemektir: r"c:\nurten"
de göründüğü gibi anlaşılır.
Ayraçlı dizgiler
Çift tırnakların hemen içine gelmek koşuluyla, dizginin parçası olmayan ayraçlar yerleştirebilirsiniz. Ayraçlı dizgilerde çift tırnaklardan önce q
karakteri gelir: q".merhaba."
dizgisinin değeri "merhaba"dır; noktalar değere ait değillerdir. Hemen sonrası satır sonuna gelmek koşuluyla, ayraçları sözcükler olarak da belirleyebilirsiniz:
writeln(q"AYRAÇ
birinci satır
ikinci satır
AYRAÇ");
Bu örnekteki AYRAÇ sözcüğü dizginin parçası değildir:
birinci satır ikinci satır
D kodu dizgileri
Yine başında q
karakteri olmak üzere, {
ve }
karakterleri arasında yasal D kodu içeren dizgiler yazılabilir:
auto dizgi = q{int sayı = 42; ++sayı;}; writeln(dizgi);
Çıktısı:
int sayı = 42; ++sayı;
Dizgi değerlerin türleri
Dizgiler özellikle belirtilmediğinde immutable(char)[]
türündedirler. Sonlarına eklenen c
, w
, ve d
karakterleri dizginin türünü sırasıyla immutable(char)[]
, immutable(wchar)[]
, ve immutable(dchar)[]
olarak belirler. Örneğin "merhaba"d
dizgisinin karakterleri immutable(dchar)
türündedirler.
Bu üç türün sırasıyla string
, wstring
, ve dstring
olan takma isimlerini Dizgiler bölümünde öğrenmiştiniz.
Hazır değerler derleme zamanında hesaplanırlar
Hazır değerleri işlem halinde de yazabilirsiniz. Örneğin Ocak ayındaki toplam saniye değerini 2678400
veya 2_678_400
olarak yazmak yerine, değerin doğruluğundan emin olmamıza yarayan 60 * 60 * 24 * 31
şeklinde de yazabilirsiniz. İçinde çarpma işleçleri olsa da, o işlem programınızın çalışma hızını düşürmez; hazır değer, derleme zamanında yine de 2678400 olarak hesaplanır ve sanki siz öyle yazmışsınız gibi derlenir.
Aynı durum dizgi hazır değerleri için de geçerlidir. Örneğin "merhaba " ~ "dünya"
yazımındaki dizgi birleştirme işlemi çalışma zamanında değil, derleme zamanında yapıldığı için programınız sanki "merhaba dünya" yazılmış gibi derlenir ve çalışır.
Problemler
- Aşağıdaki satır derlenemez:
int miktar = 10_000_000_000; // ← derleme HATASI
Derleme hatasını giderin ve
miktar
'ın on milyara eşit olmasını sağlayın. - Bir tamsayının değerini sonsuz bir döngüde arttıran ve bunu ekrana yazdıran bir program yazın. Döngünün her tekrarında sayının değeri ekrana yazdırıldığı halde, yazılan değer hep aynı satırda çıksın:
Sayı: 25774 ← hep aynı satırın üstüne yazılsın
Bunun için yukarıdaki kontrol karakterlerinden birisi işinize yarayacak.