Thread overview
9.1 Mantıksal İfadeler Konusundan (Kitaptan)
Feb 16, 2022
Salih Dincer
Feb 16, 2022
Salih Dincer
Feb 16, 2022
Ali Çehreli
February 16, 2022

Kitaptan sayfa: 20 'de (pdf 'de sayfa: 40 'ta)

Verilen Örnek Üzerine

Bu örnekte derleyicinin bana girdiğim tipin yanlış olduğu uyarısını söylemesini beklerdim. Ama o, bana sadece "false" verdi. Ama ben int tipinden bir kıyaslama yapmadım ki bool tipinden bir kıyaslama yaptım. Bu kitapta türlerin tanıtılmasının geçtiği sayfalardan birinde D- 'de bool 'un en az = false ve en çok = true yazdırıyordu, galiba bununla ilgisi var.

>

import std.stdio;

void main() {

    bool yediğimiz_gol, attığımız_gol;
    yediğimiz_gol = true;
    attığımız_gol = false;
    stdout.writeln(yediğimiz_gol < attığımız_gol);            
	}
February 16, 2022

On Wednesday, 16 February 2022 at 06:48:40 UTC, İsmail Emre ARIKAN wrote:

>

Kitaptan sayfa: 20 'de (pdf 'de sayfa: 40 'ta)

Verilen Örnek Üzerine

Bu örnekte derleyicinin bana girdiğim tipin yanlış olduğu uyarısını söylemesini beklerdim. Ama o, bana sadece "false" verdi. Ama ben int tipinden bir kıyaslama yapmadım ki bool tipinden bir kıyaslama yaptım. Bu kitapta türlerin tanıtılmasının geçtiği sayfalardan birinde D- 'de bool 'un en az = false ve en çok = true yazdırıyordu, galiba bununla ilgisi var.

>

import std.stdio;

void main() {

   bool yediğimiz_gol, attığımız_gol;
   yediğimiz_gol = true;
   attığımız_gol = false;
   stdout.writeln(yediğimiz_gol < attığımız_gol);
	}

Evet, tahminim doğru çıktı. Çünkü aradaki işareti " > " yapınca programda (true
">" false ) oldu ve true sonucunu aldım.

February 16, 2022

On Wednesday, 16 February 2022 at 06:48:40 UTC, İsmail Emre ARIKAN wrote:

>

Bu örnekte derleyicinin bana girdiğim tipin yanlış olduğu uyarısını söylemesini beklerdim. Ama o, bana sadece "false" verdi.

Bu türün (bool) bir özelliği vardır. Sadece 2 değer tutar 0 veya 1. Ama derleyici kapasitesi yetiyorsa 1'i geçmeyen değerleri otomatik dönüştürerek true yapabilir:

  bool[] hepsiTrue;
  "Boş bir dizi: ".writeln(hepsiTrue.length);
  hepsiTrue ~= true;
  hepsiTrue ~= hepsiTrue[0] ? true : false;
  hepsiTrue ~= bool.max;
  hepsiTrue ~= bool.min + 1;
  hepsiTrue ~= 0 + 1;
  hepsiTrue ~= cast(bool)2^^1;
  hepsiTrue ~= 10/10;
  hepsiTrue ~= 0b0000_0001;
  hepsiTrue ~= 1;

//hepsiTrue ~= 1 << 1; // HATA: çünkü 1'den büyük değer olamaz...
//hepsiTrue ~= 'A'; // HATA: çünkü char değeri alamaz!
  hepsiTrue.writeln;
  if(hepsiTrue.length) "Bu dizi dolu görünüyor...".writeln;

Hatta bazı türleri yani 0'dan büyük değerleri bool: true gibi kullanabiliyoruz. Buna aşağıdaki örnekte diğer temel türler de dahil.

  char birÇeşitTrue = 'A';
  if(birÇeşitTrue) 'A'.writeln(" harfi içeriyor olabilir!");

  char birÇeşitFalse = 0;
  if(birÇeşitFalse) writeln("Hiçbir harf içermediği kesin!");

  if(birÇeşitTrue > birÇeşitFalse) "Bence de çünkü: ".writeln(birÇeşitTrue > birÇeşitFalse);
/* ÇIKTISI:
Boş bir dizi: 0
[true, true, true, true, true, true, true, true, true]
Bu dizi dolu görünüyor...
A harfi içeriyor olabilir!
Bence de çünkü: true```
*/
February 16, 2022

Sağolun Salih DİNÇER hocam. Henüz kitaptan o kadar mesafe katetmediğim halde bool türünün kullanım yerleri ile ilgili verdiğiniz örnekler bence anlaşılır olmuş. Hem bir kaç özellik öğrenmiş oldum.

February 16, 2022

On Wednesday, 16 February 2022 at 11:02:45 UTC, İsmail Emre ARIKAN wrote:

>

Sağolun Salih DİNÇER hocam. Henüz kitaptan o kadar mesafe katetmediğim halde bool türünün kullanım yerleri ile ilgili verdiğiniz örnekler bence anlaşılır olmuş. Hem bir kaç özellik öğrenmiş oldum.

Aslında atladığım bir şey var o da değişken isimleri ile alakalı. Çünkü bool türü için ne hepsiTrue doğru bir isimlendirme ne yediğimiz_gol de anlamlı. Belki içerdiği anlamlar başta iyi gibi görünse de sonradan kafa karıştırıcı olabiliyor...

Bu konuda Ali hocam daha iyi. Ben her zaman doğru isimlendirme yapamayabiliyorum. Şöyle ki:

hepsiTrue bir dinamik dizi olduğu ve/veya const (yani değişmez) olmadığı için her zaman true diyemeyiz. Gerçi burada vurgulu bir örnek olsun diye böyle bir isimlendirme yapıldı. Ama benzer şey atılan/yenilen goller için de geçerli. Şöyle ki:

Sonuçta atılan gollerin sayısı 1'den fazla olacağı için bool kullanılacaksa maçıKazandık veya kazandık_mı daha doğru olacaktır.

Genelde 2 şeyden kaçınmak lazım. Sihirli sayı dedikleri herhangi bir tanımı olmayan, sağda solda satılar arasına yerleşmiş sayılar. Buna 1 rakamı veya PI sayısı gibi bilinen değerler dahil değil. İkincisi yanlış bir adlama sistemi geliştirmek.

Bazen de bir döngü içinde o an kullanılıp unutulacak ve içinde benzer değişkeni kullanan satır olmayan yerler de a, b, c gibi tek karakterli harf ile ifade edilecen değişkenler kullanılabiliyor. Yine de çakışma (shadowing) olmaması için isimlendirmeler akıllıca tasarlanmalı.

February 16, 2022
On 2/16/22 02:28, Salih Dincer wrote:
> On Wednesday, 16 February 2022 at 06:48:40 UTC, İsmail Emre ARIKAN wrote:
>>
>>  Bu örnekte derleyicinin bana girdiğim tipin yanlış olduğu uyarısını
>> söylemesini beklerdim. Ama o, bana sadece "false" verdi.

Kullanıcı türleri de dahil bütün türler sıralama kavramını destekler. bool için false, true'dan önce gelir. Salih'in de dediği gibi, attığımız_gol gibi değişkenlerin değerlerini "gol adedi" bilgisini tutuyorlar diye tamsayı olarak düşünmüştüm. Ama öyle düşündüğümü açıkça belirtmemişim. İsmail, okuyucunun bakış açısının nasıl farklı olabileceğini gösteriyor. :)

> Bu türün (```bool```) bir özelliği vardır. Sadece 2 değer tutar 0 veya
> 1.

Sen de Walter Bright gibi düşünüyorsun: Ona göre bool, tek bitlik bir tamsayı türüdür. O yüzden toplama işlemini destekler gibi görünebiliyor:

  auto a = true;
  auto b = true;
  assert(a + b == 2);

Peki nasıl oldu da sonuç 2? Ha, o başka konu: int'ten küçük türler aritmetik işlemlerde önce int'e dönüştürülürler ya... O yüzden (a + b)'nin türü de int.

Başka bir karışıklık: Neden bool 0 ve 1 diye değil de false ve true diye yazdırılıyor?

İşte bu farklılıkları yüzünden ben dahil bazılarımız bool'un tamsayı olmamaması gerektiğini düşünüyoruz. Ama bu noktadan sonra yapacak şey yok. bool böyle. :)

> Ama derleyici kapasitesi yetiyorsa 1'i geçmeyen değerleri otomatik
> dönüştürerek true yapabilir:

Kullanıcı türleri dahil, her tür mantıksal ifadelerde kullanılabilir. Tamsayılarda 0 false'tur. Yani, -42 de true'dur. (1'den büyük olması gerekme.) Ama, ancak if gibi mantıksal ifade gereken yerlerde öyle otomatik olarak dönüşür:

  if (-42) {
    // ...
  }

Haydi! Şimdi bir mantıksızlık ;) daha var. Acaba 0 tamsayıların ilk değeri diye mi false yoksa 0 diye mi? Çünkü karakter türlerinin .init değeri true'dur. (Hatırlarsanız, örneğin char.init 0 değildir.)

  char c;
  if (c) {
    assert(false);  // <-- Patlar
  }

Neyse... :)

Ali