D Programlama Dili – Programlama dersleri ve D referansı
Ali Çehreli

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ğer
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 ifadeyle 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ğişken
sekme: [tab], çıktı düzeni için kullanılan hayali sütunlar
... bütün sözlük



İ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 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:

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

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