Akademisyenler öncülüğünde matematik/fizik/bilgisayar bilimleri soru cevap platformu
0 beğenilme 0 beğenilmeme
1.7k kez görüntülendi
For döngüsünün koşul kısmına mantıksal bir ifade koymayıp onun yerine değişken ataması yaptığımızda döngü çalışıyor ve sonsuz döngüye giriyor.

 

for(int q=-2;q=-5;q+=3){

      printf("%d",q); //q nun değerini yazdır

      break;
}

ekrana -5 basıyor ve break yazdığımız için bitiyor ama break yazmazsak sonsuz döngüye giriyor.

for(int q=-2;q=0;q+=3){

      printf("%d",q); //q nun değerini yazdır

      break;
}

dediğimde ise döngü çalışmıyor (tek farkı -5 yerine 0 yazmış olmam) bunun nedeni nedir? Döngüler niye böyle çalışıyor?
Veri Bilimi kategorisinde (21 puan) tarafından 
tarafından düzenlendi | 1.7k kez görüntülendi

Bildiğim kadarıyla ikinci bölge koşul kısımı.

for ( atama_ifadeleri; çalışma_şartı ; sayaç_artırma_azaltma_ifadeleri)

{

       komut1;

       .......

       komutn;

}

C 'de yeni dillerin aksine boolean sonuçları biraz farklıdır.

0 ifadesi False Döndürür.

!0 ifadesi True Döndürür.Yani 0'a eşit olmayan her sayı True döndürür.

örneğin:

while(1){

     komut;

}

 sonsuz döngüye girer çünkü koşul her zaman 1 olacaktır.

ama eğer şöyle olsaydı

int n = 7;

int sonuç = 1;

while (n == 1)

{


    sonuç *= n;

    n -= 1;

}

bu döngü n = 1 olduğu takdirde son bulacaktır.


Kısacası her Boolean ifade Ya 0 yada 0'a eşit olmayan bir sayı döndürür.

Ve bu for döngüsündeki ikinci kısım boolean ifadesi barındıran bölümdür.Sen onu sıfıra eşitlediğin için döngü çalışmaz.


Döngünün koşul kısmında bool ifade bulunması gerekiyor, ama bool bir ifade yerine bir değişkenin değeri değiştirilmiş q=-5 yapılmış. q==-5 olsaydı bool bir ifade olurdu ve 0 kabul edip dönmezdi ama çift eşittir koymamış. Derleyici atama işlemini 1 kabul etmiş. 

Evet ,bende şimdi fark ettim kusura bakma.

Tam emin değilim fakat bildiğim şu ki

Eğer tek '=' tanımlama , '==' ise bool oluyor.

sanırsam bu koşul kısmında hem q'ya değer ataması yapıyor hem de q'yu koşul alıyor.

Yani 

for(int q=-5;q;q+=3){
      printf("%d",q); 

      break;
}

olurdu.Öyle olmalı ki 
for(int q=-2;q=0;q+=3){
      printf("%d",q); 
      break;
}
sonucu döngü çalışmasın.Yani tahminim bu.
İlgi çekici.

Evet haklısın koşul kısmında hem değer ataması yapıyor hem de q'nun değerini koşul olarak kabul ediyor, en mantıklı açıklama bu. 0 dışındaki değerler doğru kabul edildiği için sonsuz döngüye girdi, 0 yaptığımda ise çalışmadı.

Benim bilgisayar bilgim pek iyi degil ama garip olan ilk degerdeki -2'yi calistirmamasi degil mi? Mesela alttakinde -2 ile calisiyor. 

  for( a = -2;; a+=3 ){
      printf("%d\n", a);
      break;
}

1 cevap

0 beğenilme 0 beğenilmeme

C99 standartinda sayfa 150 de for iterasyonunun calisma sartlarini bulabilirsiniz.
'==' yerine '=' kullandiginizda yani esitlik test etmek yerine atama yaptiginizda sonuc olarak size atama yapilan deger gelecektir. O deger 0 olmadigi surece iterasyon devam edecektir.

Bu hatayi tekrarlamamak icin yoda conditionals da denilen soyle bir kodlama standardi gorebilirsiniz

for(int i = 0 ; 5==i;i++){...}

test edeceginiz degeri once yazarsaniz derleyici yanlis kullanilan '=' ler icin size bagiracaktir.

Bunun yerine derleyicinizin sizi bu konuda uyarmasini da isteyebilirsiniz modern derleyeciler de bu tur bayraglar (flag?) bulunmakta. Ornegin gcc kullaniyorsaniz -Wparentheses bayragini kullanabilirsiniz.

(1.6k puan) tarafından 
tarafından düzenlendi
20,284 soru
21,823 cevap
73,508 yorum
2,569,963 kullanıcı