Наверняка в простых примерах на С++ вы часто замечали слово endl в конце вывода с помощью cout. Эта штука выполняет перевод строки. Но не только. Перевод строки можно выполнить с помощью управляющего символа \n. Но почему-то часто используют именно endl.
Символ \n - это просто символ новой строки. Никаких других действий, кроме перевода строки он не выполняет. В отличие от него, манипулятор endl кроме перевода строки ещё и сбрасывает (очищает) буфер вывода.
Дело в том, что выводимые данные накапливаются в буфере и не записываются на диск, чтобы ускорить работу программы. Но в некоторых случаях желательно очищать буфер перед следующим выводом. Тогда лучше использовать endl вместо \n. В большинстве случаев разницы в скорости вы не заметите. Но если это применяется, например, при выводе больших файлов, то замедление может оказаться заметным.
Ну и также не забывайте, что входной и выходной буфер - это разные буферы. На входной буфер endl не влияет. Например, вот такой код:
char str[10];
cin >> str;
cout << str << endl;
//Этого на экране уже не будет, т.к.
//во входном буфере уже есть прочитанные данные
cin.getline(str, 10);
cout << str;
не выведет на экран повторно содержимое str. И такое поведение, мягко говоря, не является интуитивно понятным. Вот за что я люблю Паскаль - там никогда ничего подобного не произойдёт. Ну а в С++ - пожалуйста.
То есть здесь мы ожидаем, что пользователь два раза введёт какие-то данные, один раз мы получим их через cin, а другой раз с помощью функции getline(). Но не тут-то было. Первый раз всё отработает по плану. Но на этом программа завершится, потому что в буфере уже есть прочитанные данные. И дальше программа просто завершается. При этом функция getline() возвращает true, несмотря на то, что никаких новых данных пользователь не вводил (но буфер-то она прочитала). Ну а почему при этом не выполняется последняя строка кода (cout << str;) для меня загадка. Если есть бывалые сишники - объясните.
Чтобы эта программа заработала так, как нам хочется, надо либо продолжать использовать cin, либо перед вызовом очистить входной буфер. Например, так:
В таком варианте всё отработает как запланировано. Но вот скажите, додумается ли до этого новичок? И сколько ему придётся времени провести в Интернете, чтобы найти решение вопроса?
Так что вполне понятно, почему более простые языки сегодня так популярны - там сложно ошибиться на ровном месте, и не так часто требуется тратить кучу времени на поиск решения.
На этом всё. Подписывайтесь на канал, чтобы ничего не пропустить.