C++ float sayı ile for döngüsü sorunu

Bunun için std::cin'in çalışma mekanizmasını anlamak gerek:

  1. >> operatörü sonrası kullanıcı bir veri girdiğinde, bu veri bir buffer'a aktarılıyor. Mesela 12.4 girip enter’a bastık, buffer’a 12.4\n yazılıyor.

  2. std::cin bu buffer’a bakıyor:

    • Eğer buffer boşsa veya sadece whitespace'den oluşuyorsa (yani " " , "\t", "\n" gibi), kullanıcı input girmesi için bekleniyor. Program başında buffer’ı boş olarak düşünebiliriz.

    • Eğer buffer doluysa belirtilen değişkene (num oluyor sizdeki karşılığı), buffer’dan aktarabildiği kadar veriyi aktarıyor. Aktarma yapamadığı elemanlar buffer’da kalmaya devam ediyor. Bu durumda 12.4 girip enter’a basarsak, num (int olduğu için) değişkenine 12 atanıyor, buffer’da ise .4\n kalıyor.

  3. Eğer buffer’daki veri eldeki değişkene aktarılamayacak gibiyse, değişkene:

    • C++11 öncesi ise, değişkenin değeri değişmiyor (yani num 12 olarak kalır)
    • C++11 ve sonrası ise, değişkene 0 atanıyor (yani num 0 oluyor)

Şimdi sizin soruya bu mekanizmayı uygularsak:

  1. Başta buffer “boş”, std::cin kullanıcıdan input bekler.
  2. Biz 2. girip enter’a basarız.
  3. Buffer’da şu an 2.\n var.
  4. std::cin, bir int olan num'a en fazla 2yi atayabilir.
  5. Şu an num'da 2 değeri var, buffer’da .\n
  6. for çalışır, 2 kere döner hey felan yazılır.
  7. Tekrar while'ın başına döndük.
  8. std::cin önce buffer’a bakıyor boş mu dolu mu diye.
  9. Buffer “dolu” ve .\n var, kullanıcıdan istemeye gerek yok; ama int'e dönüştüremiyor buffer’daki değeri.
  10. Dolayısıyla, (C++ versiyonuna göre) num ya 2 olarak devam ediyor, ya da 0 oluyor.
  11. for döngüsü num'a göre (0 veya 2 kere) dönmeye devam eder.
  12. 7.adıma gidilir.

Sizdeki çıktıdan C++ versiyonunuzun C++11 veya üzeri olduğu anlaşılıyor çünkü hiç hey yazmamış, demek ki for 0 kere dönmüş.

Kaynaklar:
https://www.learncpp.com/cpp-tutorial/5-10-stdcin-extraction-and-dealing-with-invalid-text-input/
https://stackoverflow.com/a/13379073/9332187

2 Beğeni