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 derste 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; ve bazı durumlarda daha uygun olan onaltılı, sekizli, veya ikili sayı sistemlerinde...
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.
Ondalık sayı sisteminde: Günlük hayatımızda kullandığımız gibi, onlu rakamlarla yazılır. Örnek: 12. Ondalık değerlerin ilk rakamı 0 olamaz; çünkü 0 ile başlayan değerler sekizli sayı sistemine ayrılmıştır. Örneğin 010'un değeri 10 değil, 8'dir.
Onaltılı sayı sisteminde: 0x veya 0X ile başlayarak ve onaltılı sayı sisteminin rakamları olan "0123456789abcdef" ve "ABCDEF" ile yazılır. Örnek: 0x12ab00fe.
Sekizli sayı sisteminde: 0 ile başlayarak ve sekizli sayı sisteminin rakamları olan "01234567" ile yazılır. Örnek: 0576.
İ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ğişkenin 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); }
--- 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 onaltılı sayı sisteminde yazılabilirler. Örneğin ondalık olarak 1.234 veya onaltılı olarak 0x9a.bc
Ondalık 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.
Onaltılı sayı sisteminde: Sayı 0x veya 0X ile başlar; noktadan önceki ve sonraki bölümleri onaltılı sayı sisteminin rakamlarıyla yazılır. e ve E de onaltı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.
Değerin sonuna eklenen i, o değerin türünü bir sanal tür haline getirir. Örneğin 7.8i idouble'dır, 9.1fi ifloat'tur, ve 11.12Li ireal'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.
Karakter belirteci olarak: Ters bölü işaretinden sonra bir karakter belirteci kullanılabilir. Örneğin ters bölü karakterinin kendisi '\\' şeklinde yazılır. Karakter belirteçleri ş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 |
ASCII karakter kodu olarak: Değerleri 256'dan küçük olan karakterleri, kodunu vererek yazabilirsiniz. Yukarıda tamsayılar başlığında anlatılanlara uygun olarak, kodu \x ile başlayan 2 haneli onaltılı sayı olarak veya 3 haneye kadar sekizli sayı olarak yazabilirsiniz. Örneğin '\x21' ve '\041' ünlem işareti karakterinin iki farklı yazımıdır.
Unicode karakter kodu olarak: u karakterinden sonra 4 onaltılı rakam olarak yazılırsa türü wchar olur; U karakterinden sonra 8 onaltı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 D'nin isimli karakterler listesinde gösterilen isimleriyle ve '\&karakter_ismi;' söz dizimiyle yazabilirsiniz. Örneğin '\€' €, '\♥' ♥, ve '\©' © 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.
Onaltılı sistemde yazılan dizgiler
Karakterlerinin kodları onaltılı sayı sisteminde yazılacak olan dizgilerin her karakterinin başına \x yazmak yerine, başına x belirteci gelen dizgiler kullanılabilir. Hatta bu dizgilerin içine okumayı kolaylaştırmak amacıyla boşluklar da yazılabilir. Bu boşluklar derleyici tarafından gözardı edilirler. Örneğin "\x44\x64\x69\x6c\x69" yerine x"44 64 69 6c 69" yazılabilir.
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. 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);
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 dersinde öğ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
- Yılla ilgili bir kaç bilgiyi yazdıran bu programdaki sabit değerler, kod düzenli görünsün diye üçer hane olarak yazılmışlar:
- Bir bankacılık oyun programında oyuncuların başlangıçta ellerinde bulunan para 10 milyar olsun. Bu amaçla programa yazılan şu satır yüzünden program derlenemiyor:
- 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:
import std.stdio; void main() { writeln(365, " gün"); writeln(052, " hafta"); writeln(012, " ay"); }
Ancak programın çıktısı beklendiği gibi olmuyor:
365 gün 42 hafta 10 ay
Programın doğru değerler yazdırmasını sağlayın.
int kasadakiPara = 10_000_000_000;
O satırın derlenmesini sağlayın.
Sayı: 25774 ← hep aynı satırın üstüne yazılsın
Bunun için yukarıdaki özel karakter belirteçlerinden birisi işinize yarayacak; '\n' olmadığı açık herhalde... :o) Ayrıca writef yerine dout.writef'i kullanmak daha iyi sonuç verebilir.
D.ershane
Forum
Wiki
Projeler
Tanıtım
İletişim
Hakları