D.ershane D Programlama Dili Dersleri

değişken: [variable], kavramları temsil eden veya sınıf nesnesine erişim sağlayan program yapısı
hazır değer: [literal], kod içinde hazır olarak yazılan değerler
işaretli tür: [signed type], eksi ve artı değer alabilen tür
işaretsiz tür: [unsigned type], yalnızca artı değer alabilen tür
işleç: [operator], bir veya daha fazla değişkenle iş yapan özel işaret (||, &&, +, -, =, vs.)
işlev: [function], programdaki bir kaç adımı bir araya getiren program parçası
nesne: [object], belirli bir sınıf veya yapı türünden olan değer
sekme: [tab], çıktı düzeni için kullanılan hayali sütunlar
... bütün sözlük

Bölümler
İngilizce Kaynaklar
Diğer



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:

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
  1. 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:
  2. 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.

  3. 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:
  4.     int kasadakiPara = 10_000_000_000;
    

    O satırın derlenmesini sağlayın.

  5. 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:
  6. 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.

... çözümler