June 26, 2011

(Bunu daha önce konuşmuştuk galiba. Az önce D.ershane'yi bu konuda düzelttim.)

C, C++ ve belki başka dillerde de hatalara neden olan bir konu, 0 ile başlayan hazır değerlerin sekizli düzende algılanmasıdır. Örneğin 020 yazınca değer 16'dır (2 çarpı 8 artı 0).

Ama işin kötüsü bu durum bazen farkedilmez ve hata bazen kodun içinde bir saatli bomba gibi bekler. Çünkü örneğin 007 hem ondalık hem de sekizli sistemde tesadüfen 7 değerindedir. Sonradan birisi 007'nin değerini 17 yaptığını düşünerek 017 yazar ama o sekizli düzende algılandığı için değeri aslında 15 olur (1 çarpı 8 artı 7).

Bu gibi karışıklıkları önlemek için D'de artık 0 ile başlayan hazır değerler yazılamıyor.

Onun yerine std.conv.octal ile açıkça "bu sekizli düzende yazılmıştır" demek gerekiyor. Şu program 12 hazır değerini dört sayı sisteminde yazdırıyor:

import std.stdio;
import std.conv;

void main()
{
   int ondalık  = 12;
   int ikili    = 0b1100;
   int sekizli  = octal!14;
   int onaltılı = 0xc;

   writefln("%s %s %s %s", ondalık, ikili, sekizli, onaltılı);
}

Çıktısı:

'12 12 12 12'

Bu arada octal, D'nin şablonlarının ve derleme zamanında kod üretmesinin (CTFE) güçlerini gösteren güzel bir örnek. octal da yasal olmayan sekizli değerleri derleme zamanında yakalıyor.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]

June 26, 2011

Düzeltme: CTFE'nin karşılığı olarak "derleme zamanında işlev işletme" daha doğru.

Ali

--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]