Thread overview
küçük bir if() sorusu
Jan 02, 2018
cos00kun
Jan 02, 2018
kerdemdemir
Jan 02, 2018
cos00kun
January 02, 2018
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 ?

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

January 02, 2018

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

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

January 02, 2018

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

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

January 02, 2018

Alıntı (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 ?

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

Evet, ben de öyle biliyorum.

Ali

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

January 03, 2018
   // 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

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