Разница между endl и \ n


person Nawaz    schedule 22.12.2010    source источник
comment
Возможный дубликат: stackoverflow.com/questions/213907/c-stdendl-vs-n   -  person Bill Cheatham    schedule 22.12.2010
comment
Практическая разница редко бывает. За исключением того, что endl очистит поток. Если вам не нужно полностью очищать поток, вы можете использовать любой из них.   -  person Daniel Lidström    schedule 22.12.2010
comment
Используйте std :: endl, если он имеет какое-либо взаимодействие с пользователем. Но предпочитайте '\ n', если вы просто создаете автономный файл или что-то в этом роде.   -  person Martin York    schedule 22.12.2010


Ответы (1)


Да они разные.

"\n" - это просто строка длиной 1, которая добавляется к stdout.

std::endl, напротив, представляет собой объект, который вызывает добавление символа новой строки ("\n") И для очистки буфера стандартного вывода. По этой причине потребуется дополнительная обработка.

person peoro    schedule 22.12.2010
comment
На самом деле, это может быть другим, но не должно быть. Большинство консолей имеют строчную буферизацию, что означает, что они будут сброшены на новую строку, независимо от того, явным ли вы явным образом сбросили ее самостоятельно, - person Billy ONeal; 22.12.2010
comment
ostream тоже имеет свой собственный буфер, поэтому я думаю, что консоль с линейной буферизацией - не единственный фактор. Если ostream не сбрасывается после того, как он поместил '\ n' в свой буфер, консоль никогда не увидит новую строку. - person Johannes Schaub - litb; 22.12.2010
comment
[Nitpicking Mode On] '\ n' - это символ, а \ n - это строка длины 1. В некоторых случаях запись символа в буфер может быть быстрее. [Nitpicking Off] - person watson1180; 22.12.2010
comment
В моей последней работе, неназванной несколько лет назад, у нас был случай (написание большого текстового файла), в котором изменение с endl для каждой строки на \ n для них дало очень заметную разницу - от паузы ~ 2 с при сохранении вплоть до отсутствия обнаруживаемой пользователем паузы при сохранении. - person Caleb Huitt - cjhuitt; 22.12.2010
comment
@BillyOneal: Консоль не актуальна. Iostream сбрасывается с endl, а не с "\n", и это все, что касается C ++. - person Lightness Races in Orbit; 10.02.2011
comment
@Tomalak: Неправда. Что касается C ++, нижележащему потоку разрешено сбрасывать его при каждом вызове для всех, что ему небезразлично, в том числе и для новых строк. (Это не является обычным явлением, если, конечно, не установлено unitbuf) endl принудительно выполняет сброс, но то, что вы используете "\n" вместо endl, не означает, что вы избегали очистки буфера. - person Billy ONeal; 10.02.2011
comment
@BillyOneal: Нет. Что касается C ++, то базовый поток не существует. - person Lightness Races in Orbit; 11.02.2011
comment
@Tomalak: В этом нет никакого смысла. Конечно, основной поток существует, как еще можно было использовать operator<< на нем? (Примечание: когда я говорю «базовый поток», я имею в виду конкретный экземпляр std::ostream - то есть файловый поток или строковый поток. Возможно, я не понял?) Моя точка зрения заключается в том, что потоку разрешено очищаться, когда он захочет. Вы можете заставить его смыться, но не можете предотвратить смывание. В большинстве распространенных реализаций для консольных потоков новая строка просто запускает сброс - стандарт C ++ не говорит, что это должно происходить, но и не запрещает этого. - person Billy ONeal; 11.02.2011
comment
Я сказал, что касается C ++. поток мог бы писать в реке с водой для всех языковых забот. Существует разделение между абстракцией языка и любыми особенностями основного консольного потока; действительно, это половина смысла любого языка программирования, существующего в первую очередь (наряду с тем, чтобы сделать программные машины немного более удобными для человека). - person Lightness Races in Orbit; 14.02.2011
comment
@Billy: ›› (Примечание: когда я говорю «базовый поток», я имею в виду конкретный экземпляр std :: ostream - то есть файловый или строковый поток. Возможно, я не совсем понял?) Ну, тогда это другое. Какая странная терминология! - person Lightness Races in Orbit; 14.02.2011
comment
@Tomalak: Извините, я думал о фактических operator<< функциях, которые определены в терминах общих ostream, а не о конкретном экземпляре, который вы используете. - person Billy ONeal; 14.02.2011