Есть ли причина использовать 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