Есть ли причина использовать endl с cout, когда я могу просто использовать \n? В моей книге по C ++ сказано использовать endl, но я не понимаю, почему. \n не поддерживается так широко, как endl, или я что-то упускаю?
Зачем использовать endl, если я могу использовать символ новой строки?
Ответы (3)
endl добавляет '\n' в поток и вызывает flush() в потоке. Так
cout << x << endl;
эквивалентно
cout << x << '\n';
cout.flush();
Поток может использовать внутренний буфер, который фактически передается, когда поток очищается. В случае cout вы можете не заметить разницы, поскольку он каким-то образом синхронизирован (связан) с cin, но для произвольного потока, такого как файловый поток, вы заметите разницу в многопоточной программе для пример.
Здесь есть интересное обсуждение того, почему может потребоваться промывка.
'\n' прозрачно конвертируется в соответствующий символ. Итак, да, поскольку endl прикрепляет '\n', это происходит. Но это не относится к endl.
- person Chad La Guardia; 06.09.2011
(cout << x << '\n').flush();. То есть теперь все в одном операторе, поскольку cout << x << endl; - это одно выражение.
- person Nawaz; 06.09.2011
'\n' прозрачно преобразован, явно не указан в стандарте C ++; это что-то, что было перенесено из стандарта C.
- person Chad La Guardia; 06.09.2011
endl - это больше, чем просто псевдоним для символа \n. Когда вы отправляете что-то в cout (или любой другой выходной поток), он не обрабатывает и не выводит данные немедленно. Например:
cout << "Hello, world!";
someFunction();
В приведенном выше примере существует некоторая вероятность того, что вызов функции начнет выполняться до того, как вывод будет сброшен. Используя endl, вы принудительно выполняете сброс перед выполнением второй инструкции. Вы также можете убедиться в этом с помощью функции ostream::flush.
endl - это функция, а не ключевое слово.
#include <iostream>
int main()
{
std::cout<<"Hello World"<<std::endl; //endl is a function without parenthesis.
return 0;
}
Чтобы понять картину endl, вам сначала нужно разобраться в теме "Указатель на функции".
посмотрите на этот код (на C)
#include <stdio.h>
int add(int, int);
int main()
{
int (*p)(int, int); /*p is a pointer variable which can store the address
of a function whose return type is int and which can take 2 int.*/
int x;
p=add; //Here add is a function without parenthesis.
x=p(90, 10); /*if G is a variable and Address of G is assigned to p then
*p=10 means 10 is assigned to that which p points to, means G=10
similarly x=p(90, 10); this instruction simply says that p points to add
function then arguments of p becomes arguments of add i.e add(90, 10)
then add function is called and sum is computed.*/
printf("Sum is %d", x);
return 0;
}
int add(int p, int q)
{
int r;
r=p+q;
return r;
}
Скомпилируйте этот код и посмотрите результат.
Вернуться к теме ...
#include <iostream>
//using namespace std;
int main()
{
std::cout<<"Hello World"<<std::endl;
return 0;
}
Файл iostream включен в эту программу, потому что прототип объекта cout присутствует в файле iostream, а std - это пространство имен. Он используется, потому что определение (файлы библиотеки) cout и endl присутствует в пространстве имен std; Или вы также можете использовать вверху «using namespace std», чтобы не писать «std :: coutn ‹< .....» перед каждым cout или endl.
когда вы пишете endl без парантезиса, вы передаете адрес функции endl в cout, затем вызывается функция endl и изменяется строка. Причина этого
namespace endl
{
printf("\n");
}
Вывод: за C ++ работает код C.
endl. См. Также этот ответ + комментарии. - person ildjarn   schedule 06.09.2011'\n'иstd::endl(разница вflush). (Платформы Mac, начиная с OSX (я думаю), основаны на Unix и используют'\n'для обозначения концов строк.) - person Keith Thompson   schedule 06.09.2011std::cerr, который также не требует явной очистки. - person UncleBens   schedule 06.09.2011std::cerrможет легко перейти в другой файл, чемstd::cout. - person Keith Thompson   schedule 07.09.2011\endl), а когда просто\n. programmers.stackexchange.com/questions/185064/ - person Ruchir   schedule 21.08.2015