Forum: D Programlama Dili RSS
küçük bir if() sorusu
cos00kun #1
Üye Kas 2014 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: küçük bir if() sorusu
void main()
{
    import std.range, std.stdio;
    if("")  {
        writeln("if için true çalıştı ");
    }
 
    else
    {
        writeln("if için false çalıştı ");
    }
    readln();
}
küçük bir antreman yaparken yukarıdaki programı denedim ancak if("") ile pek anlaşamadım bu sefer  :-p
normalde if(0) false üretiyor vesaire bunları anlayabiliyorum ancak if("")aslında string ve içi boş bir şeyi temsil etmiyor mu ? bu durumda false dönmesi yani else ile tanımlı bloğun çalıştırılması gerekmezmiydi ?

başka bir deneme yaptığımda da;
 
void main()
{   
    import std.range, std.stdio;
    sting cümle;
        if(cümle)  {
        writeln("if için true çalıştı ");
    }
 
    else
    {
        writeln("if için false çalıştı ");
    }
    readln();
}

Bu durumda ben şunu anlıyorum eğer bir string değişkeni tanımlanırken atama yapmadıysak içi boştur ancak strring cümle="" türü bir atama dahi yapılsa içi doludur(her ne kadar içi boş olsada) bunumu anlamalıyım ?
E=mc^2
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4591 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Lütfen böyle sorulara devam! ;)

Doğru anlıyorsun. Hiç değer atanmamış string ile boş değer atanmış string arasında ayrım yapabilmek gerekebiliyor. Buna rağmen, programcının genelde ilgilendiği, string'in boş olmamasıdır. Onu da ya .length ile ya da benim daha çok beğendiğim std.array..empty ile denetleriz:
void main() {
    string hiçAtanmamış;
    string boş = "";
    string dolu = "dolu";
 
    import std.array : empty;
    assert(hiçAtanmamış.empty);
    assert(boş.empty);
    assert(!dolu.empty);
 
    assert(hiçAtanmamış.length == 0);
    assert(boş.length == 0);
    assert(dolu.length != 0);
}
Not: Bazı programcılar hiçAtanmamış.length'in hatalı bir kullanım olmasını beklerler ama D'de öyle değildir. Atanmamış dizilerin uzunlukları sıfırdır.

Ali
kerdemdemir #3
Üye Eyl 2013 tarihinden beri · 152 mesaj · Konum: Danimarka
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Ali abi bende bir soru soracam.

"" yaptığımızda immutable char[] 'e  yani string'e bir adres atanıyor ve null olmuyor.
Ama  atama yapmadığımızda D'nin özelliği olarak atama yapılmayan diziler ve objeler null oluyor ve if o yüzden false dönüyor.

Acaba doğru anlamışmıyım.

Erdem
acehreli (Moderatör) #4
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4591 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Evet, ben de öyle biliyorum.

Ali
cos00kun #5
Üye Kas 2014 tarihinden beri · 221 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #1
cos00kun:
void main()
{
    string cümle;
    // cümle="";
    import std.range, std.stdio;
    if(cümle)  {
        writeln("if için true çalıştı ");
    }
 
    else
    {
        writeln("if için false çalıştı ");
    }
    readln();
}
..............
............
Bu durumda ben şunu anlıyorum eğer bir string değişkeni tanımlanırken atama yapmadıysak içi boştur ancak strring cümle="" türü bir atama dahi yapılsa içi doludur(her ne kadar içi boş olsada) bunumu anlamalıyım ?

Şimdi bana göre yine değişik bir sorum daha olacak ancak çokta basit olabilir cevabı aslında.. Sorum şu;
bu şekliyle kodu çalıştırdığımızda  cümle değişkeni false olacaktır.. Koddaki
  // cümle=""; 
  ifadesindeki "//" leri kaldırıp çalıştırdığımızda bu seferde false döndrüeceği de aşikardır. Şimdi herhangi bir farklı değişken kullanmadan dilin olanaklarını kullanarak  cümle yi nasıl hiç atanmamış hale getirebilirim ? yani cümle=""; işlemini görmüş cümle değişkenini nasıl tekrar  "string cümle;"  yapabilirim ?
E=mc^2
acehreli (Moderatör) #6
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4591 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
    // null
    s = "";
    assert(s);
    s = null;
    assert(!s);
 
    // null'ın aynısı olan string.init
    s = "";
    assert(s);
    s = string.init;
    assert(!s);
 
    // string.init'in aynısı olan s.init
    s = "";
    assert(s);
    s = s.init;
    assert(!s);
Ali
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2018-01-21, 00:28:43 (UTC -08:00)