Есть ли причина использовать endl
с cout
, когда я могу просто использовать \n
? В моей книге на С++ используется endl, но я не понимаю, почему. Не поддерживается ли \n
так широко, как endl
, или я что-то не хватает?
Зачем использовать endl, когда я могу использовать символ новой строки?
Ответ 1
endl
добавляет '\n'
к потоку и вызывает flush()
в потоке. Так
cout << x << endl;
эквивалентно
cout << x << '\n';
cout.flush();
В потоке может использоваться внутренний буфер, который фактически передает потоки при потоке. В случае cout
вы можете не заметить разницу, так как она как-то синхронизирована (привязана) с cin
, но для произвольного потока, такого как поток файлов, вы заметите разницу в многопоточная программа, например.
Здесь интересная дискуссия о том, почему может понадобиться промывка.
Ответ 2
endl
больше, чем просто псевдоним для символа \n
. Когда вы отправляете что-то в cout
(или любой другой выходной поток), он не обрабатывает и не выводит данные немедленно. Например:
cout << "Hello, world!";
someFunction();
В приведенном выше примере есть вероятность, что вызов функции начнет выполняться до выключения. Используя endl
, вы принудительно выполняете сброс до выполнения второй команды. Вы также можете убедиться, что с помощью функции ostream::flush
.
Ответ 3
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 - пространство имен. Он используется, потому что defination (файлы библиотеки) cout и endl присутствует в пространстве имен std; Или вы также можете использовать "using namespace std" сверху, поэтому вам не нужно писать "std:: coutn < <....." перед каждым cout или endl.
когда вы пишете endl без paranthesis, вы указываете адрес функции endl cout, после чего вызывается функция endl и изменяется строка. Причина:
namespace endl
{
printf("\n");
}
Заключение: За С++ работает код C.