Если вы введете fd
, он выведет несколько цифр, потому что эти цифры есть то, что lol
имеет в них, прежде чем оно будет присвоено. cin >> lol
не записывает в lol
, потому что у него нет приемлемого ввода для вставки, поэтому он просто оставляет его в покое, и значение равно тому, что было до вызова. Затем вы выводите его (который является UB).
Если вы хотите убедиться, что пользователь ввел что-то приемлемое, вы можете заключить >>
в if
:
if (!(cin >> lol)) {
cout << "You entered some stupid input" << endl;
}
Также вы можете присвоить lol
перед чтением, чтобы в случае сбоя чтения оно все же имело какое-то приемлемое значение (и не для использования в UB):
int lol = -1; // -1 for example
Если, например, вы хотите выполнить цикл до тех пор, пока пользователь не предоставит вам верный ввод, вы можете сделать
int lol = 0;
cout << "enter a number(int): ";
while (!(cin >> lol)) {
cout << "You entered invalid input." << endl << "enter a number(int): ";
cin.clear();
cin.ignore(numeric_limits<streamsize>::max(), '\n');
}
// the above will loop until the user entered an integer
// and when this point is reached, lol will be the input number