Bunun için std::cin'in çalışma mekanizmasını anlamak gerek:
-
>>operatörü sonrası kullanıcı bir veri girdiğinde, bu veri birbuffer'a aktarılıyor. Mesela12.4girip enter’a bastık, buffer’a12.4\nyazılıyor. -
std::cinbu 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 (
numoluyor sizdeki karşılığı), buffer’dan aktarabildiği kadar veriyi aktarıyor. Aktarma yapamadığı elemanlar buffer’da kalmaya devam ediyor. Bu durumda12.4girip enter’a basarsak,num(int olduğu için) değişkenine12atanıyor, buffer’da ise.4\nkalıyor.
-
-
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
num12 olarak kalır) - C++11 ve sonrası ise, değişkene 0 atanıyor (yani
num0 oluyor)
- C++11 öncesi ise, değişkenin değeri değişmiyor (yani
Şimdi sizin soruya bu mekanizmayı uygularsak:
- Başta buffer “boş”,
std::cinkullanıcıdan input bekler. - Biz
2.girip enter’a basarız. - Buffer’da şu an
2.\nvar. -
std::cin, birintolannum'a en fazla2yi atayabilir. - Şu an
num'da2değeri var, buffer’da.\n -
forçalışır, 2 kere dönerheyfelan yazılır. - Tekrar
while'ın başına döndük. -
std::cinönce buffer’a bakıyor boş mu dolu mu diye. - Buffer “dolu” ve
.\nvar, kullanıcıdan istemeye gerek yok; amaint'e dönüştüremiyor buffer’daki değeri. - Dolayısıyla, (C++ versiyonuna göre)
numya2olarak devam ediyor, ya da0oluyor. -
fordöngüsünum'a göre (0 veya 2 kere) dönmeye devam eder. - 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