July 28, 2012

Alıntı (acehreli):

>
> writeln(int.max + 1); // int olduğu için taştığından 0 yazardı
>
> long l = int.max + 1;
> writeln(l);           // long'a karar verilmiş olsa taşmayacağından 2_147_483_648 yazardı
> ```

> Belki de kodu açıklamak için eklediğimiz l değişkeni nedeniyle şaşırtıcı olmaktan öte program farklı da işlemeye başlardı.
>
Çok şaşırtıcı çünkü sonuç -2147483648. Eksi (!), nasıl olur hayret...:)

Alıntı (acehreli):
>
>

short s = 1; // Derleyici hata vermeli mi?

>

Aslında dil kurallarına göre yukarıdaki satırın hatalı olması gerekir çünkü 1'in türü int'tir ve int ifadeler short gibi küçük türlere otomatik olarak dönüşmezler.
Bu güzel bir olanak, tıpkı 'bool' türleri 0 veya 1 ise birbirlerine dönüşebildiği gibi. Bu kısmı D.ershane'de bugün tekrar okudum. Okurken aklıma 'if()' ve 'while()' gibi dil olanaklarında, 1'den büyük sayıların da 'true' olarak algılandığı ve bunun belirtilmesi gerektiği geçmişti. Neyse ki Ali hocam da aynı şeyleri düşünüyormuş ki ayrıntısıyla buna değinmiş...:)

Özetle aynı şeyleri konuşsak da ben bunları denemediğim için (ya da anlayış yapım farklı olduğundan!) dün anlayamamıştım. Neyse ki birebir denedim ve öğrendim. Hatta tür tespitinin 'byte''dan itibaren başladığını zannettim. Emin olmadan bunu yazdığım için de gri hale getirerek düzeltme yaptım. Çünkü yaptığımız hatalar da bizim öğrenmemizi sağlıyor. Hatta bu konuda ünlü bir düşünür (ismini hatırlayamadım) hiç bir zaman pişmanlık duymadığını, yaptığı hatalarının boş geçirlen zaman olmadığını ve aksine bunlar sayesinde geleceğe daha ne baktığını söylemiştir. Ali hocam da hatalar konusundaki hassasiyetini ve ileti düzenleme konusundaki estetiğini hatılıyorum da forumda "hata olursa olsun, bakınız bu da bir hata" cümlesiyle gerçek zamanda örneklemişti! Sonra da bunu bir sonraki iletisinde düzeltmişti...

Bu uzun özetten sonra dile getirmeliyim ki bütün mesele (Shakespeare'e gönderme!) olmak veya olmamak değil hatanın olup olmamasıdır...:)

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

July 28, 2012

Alın bir hata daha...:)
Alıntı (Salih Dinçer):

>

...aksine bunlar sayesinde geleceğe daha 'ne' baktığını söylemiştir...
Kırmızı bölüm "net" olacaktı...

Eklemeliyim; hatalar hiç bitmiyor ki insan olmanın bir gerekliliği. Ne kadar ilginçtir ki bilgisayar ile etkileşime giren (hatta ötesi onu meydana getiren) biz hatalı insanlar bilgisayarın mükemmel olmasını istiyoruz. Belki de bu bir çelişkidir! Çünkü bu bilgisayar kusursuz bir yaratık tarafından imal edilip dünyaya gelmedi ve biz programcılar onu kusursuz istiyoruz...:)

Belki de en büyük kusur, tam sayının (integer) hiç bir zaman gerçek tam sayılar kümesini temsil edemediğidir! Belki balık baştan kokar hesabı, bilgisayar işini 1/0'lardan yaptığı için bu tür sınırlamaların esiriyiz. Belki böyle olmasaydı tür dönüşümlerine hiç bir zaman ihtiyaç duymayacak hatta böyle bir tartışma da olmayacaktı! Ne diyelim, belki bir gün bu dünyaya veda etmeden evvel Quantum Bilgisayarlar ile ucundan tanışarak her şeyin 1 ve 0'dan ibaret olmadığını, her ikisiyle de (ortası, havadaki paranın yerde dik durma hadisesi gibi) dünyanı ifade edileceğini görürüz.

Belki de tek bir doğru yoktur?

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

July 28, 2012

Evet, bunlar daha önce bahsettiğimiz sayfalarda da var ama hiçbir bilgi deneyerek anlanan gibi olmuyor. :)

Burada iki farklı kavramın etkileşimi de bizi şaşırtıyor. Birinci kavram, hazır değerler için otomatik olarak seçilen tür ile ilgili. "Tamsayı değerlerin türleri" şurada:

http://ddili.org/ders/d/hazir_degerler.html

Farklı bir (aslında yakından ilgili iki) kavram olarak, "int terfileri" ve "aritmetik dönüşümler" de şurada:

http://ddili.org/ders/d/tur_donusumleri.html

Senin söylediklerini bir de ben söylüyorum:

  • 'int.max + 1' int'tir çünkü aritmetik ifadede (toplama işlemi) kullanılan iki terim de int'tir. Sonuç taşar ve bunun türün belirlenmesinde bir etkisi yoktur.

  • Aslında yukarıdakinin eşdeğeri olmasını beklediğimiz 2_147_483_648 hazır değeri long'dur çünkü onlu sistemde yazılmıştır ve int'e sığmamaktadır.

Ne yazık ki bu kuralların sol taraftaki değişkenin türü ile ilgisi yok:

long l = /* ... nasıl kullanılacağı gözardı edilen ifade ... */;

Kurallar önce ifade üzerinde uygulanır ve değeri ancak ondan sonra l'yi ilklemek için kullanılır.

Bu kuralların C ve C++'ta da öyle olmaktan başkaca geçerli nedenleri de var. Hepsini bulmaya kalkışamam ama bir örnek görebiliyorum: D'de "ilklenen değişken long ise sağdaki ifadeyi de long'a terfi ettirelim" diye bir kural olsa program şaşırtıcı davranırdı:

writeln(int.max + 1); // int olduğu için taştığından 0 yazardı

long l = int.max + 1;
writeln(l);           // long'a karar verilmiş olsa taşmayacağından 2_147_483_648 yazardı

Belki de kodu açıklamak için eklediğimiz l değişkeni nedeniyle şaşırtıcı olmaktan öte program farklı da işlemeye başlardı.

Bunların yanında derleyicinin aslında hayatımızı kolaylaştıran bir çok olanağı da var. Bunlar biz hiç farkında olmadan işliyorlar. Bunlardan birisi olan "Value Range Propagation"ı Walter C dilinde anlatıyor ama aynısını dmd de uygular:

http://www.drdobbs.com/tools/value-range-propagation/229300211

Küçük bir örnek:

short s = 1;    // Derleyici hata vermeli mi?

Aslında dil kurallarına göre yukarıdaki satırın hatalı olması gerekir çünkü 1'in türü int'tir ve int ifadeler short gibi küçük türlere otomatik olarak dönüşmezler. Derleyici buna rağmen hayatımızı kolaylaştırmak için yukarıdaki satırı derler çünkü 1 hazır değerinin short'a sığacağını görmektedir.

Buna benzer bir akıllılık yukarıdaki l'nin atanması sırasında uygulanmaz çünkü sonuçlar şaşırtıcı olabilmektedir.

Ali

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

July 28, 2012

Onun da kolayı var, çok sıfır istiyorsak buyrun buradan yakın...:)

writeln((int.max + 1) * 10);    // Çıktısı: 0

Sanırım yine kırpılma hadisesi çünkü 'int'.min * 10 sığmaz, 'int' türüne...

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

July 28, 2012

Bir hata daha: :)

Alıntı (acehreli):

>
> writeln(int.max + 1); // int olduğu için taştığından 0 yazardı
> ```


Tabii ki 0 değil, senin düzelttiğin gibi -2147483648 olur.

Ali

-- 
[ Bu gönderi, <http://ddili.org/forum>'dan dönüştürülmüştür. ]
1 2
Next ›   Last »