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.4
girip enter’a bastık, buffer’a12.4\n
yazılıyor. -
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 durumda12.4
girip enter’a basarsak,num
(int olduğu için) değişkenine12
atanıyor, buffer’da ise.4\n
kalı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
num
12 olarak kalır) - C++11 ve sonrası ise, değişkene 0 atanıyor (yani
num
0 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::cin
kullanıcıdan input bekler. - Biz
2.
girip enter’a basarız. - Buffer’da şu an
2.\n
var. -
std::cin
, birint
olannum
'a en fazla2
yi atayabilir. - Şu an
num
'da2
değeri var, buffer’da.\n
-
for
çalışır, 2 kere dönerhey
felan 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
.\n
var, kullanıcıdan istemeye gerek yok; amaint
'e dönüştüremiyor buffer’daki değeri. - Dolayısıyla, (C++ versiyonuna göre)
num
ya2
olarak devam ediyor, ya da0
oluyor. -
for
dö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