Öncelikle, böyle önemli uyarıların için tekrar teşekkürler.
Alıntı (Salih Dinçer):
> 'assert()''in düzgün veri alamadığını
Mutlaka bir açıklaması vardır. ;) Hem assert'in veri alması demek de doğru değil. Onun tek yaptığı, verilen ifadeyi işletmek.
Alıntı:
> dikkatli olmamız gerektiğini farkettim.
Her zaman! Hem de nasıl! :)
Alıntı:
> Alt çizgiler ile de alakası yok arkadaşlar...:)
Zaten olmaması gerekiyor. Alt çizginin değere etkisi olursa derleyici hatasıdır.
Alıntı:
> //assert(uint.max > (2_999_999_999 * 2)); // Assertion failure
Tamsayı işlemlerine bakmadan önce o işlemin hangi türde işletildiğinden emin olmamız gerekir. Şuradaki "Aritmetik dönüşümler" başlığına bakacağım:
http://ddili.org/ders/d/tur_donusumleri.html
Bir de şuradaki hazır değerlerin türlerine:
http://ddili.org/ders/d/hazir_degerler.html
2'nin türü int; o kolay. 2_999_999_999'un türü ise "int'e sığmadığı ve onlu olarak yazıldığı" için long.
long * int ifadesinin sonucunun türü "Aritmetik dönüşümler" başlığındaki 4.2 maddesi gereğince long.
şimdi 'uint > long' ifadesinin türüne bakalım. O da 4.3 maddesi gereğince long. Yani uint.max'a karşılık gelen long değer ile 2_999_999_999 * 2'ye karşılık gelen long değeri karşılaştırıyoruz. Bakalım:
writeln(typeid(2_999_999_999 * 2));
writefln("%x", cast(long)uint.max);
writefln("%x", 2_999_999_999 * 2);
Çıktısı:
'long
ffffffff
165a0bbfe
'
Evet, söylediklerime uyuyor. Herşey doğru işlemiş.
Alıntı:
> assert(uint.max > (999_999_999 * 22)); // (!)
Şimdi ona bakalım: çarpma işleminin solunda ve sağında int var. O yüzden işlem int üzerinden yapılıyor. Sonuç yine int ama bu sefer int'e sığmadığı için kırpılıyor. Ondan sonra > işlemi iki taraf da uint türünde olacak biçimde işletiliyor. (4.4 maddesi).
Alıntı:
> writeln(999999999 * 22); // Herhangi birinde L olmaz ise yanlış hesap ediyor!
Evet, eğer kırpılma olmasın diye açıkça long istiyorsak L yazmalıyız.
Bu kurallar çok karışık olabiliyorlar. D'ye kızamıyoruz çünkü diğer yaygın sistem dilleri olan C ve C++'tan olduğu gibi aktarılmıştır.
Ali
--
[ Bu gönderi, http://ddili.org/forum'dan dönüştürülmüştür. ]