为什么在我可以使用换行符时使用endl?

时间:2011-09-06 19:06:58

标签: c++ string-formatting iostream buffering

当我可以使用endl时,是否有理由将cout\n一起使用?我的C ++书说要使用endl,但我不明白为什么。是\n不像endl那样广泛支持,还是我错过了什么?

3 个答案:

答案 0 :(得分:70)

endl'\n'添加到流上的 调用flush()。所以

cout << x << endl;

相当于

cout << x << '\n';
cout.flush();

流可以使用内部缓冲区,该内部缓冲区在刷新流时实际流式传输。在cout的情况下,您可能不会注意到差异,因为它与cin以某种方式同步(绑定),但对于任意流(例如文件流),您会注意到例如,多线程程序的差异。

Here这是一个有趣的讨论,为什么需要冲洗。

答案 1 :(得分:6)

endl不仅仅是\n字符的别名。当您向cout(或任何其他输出流)发送内容时,它不会立即处理和输出数据。例如:

cout << "Hello, world!";
someFunction();

在上面的例子中,有一些某些机会在刷新输出之前开始执行函数调用。使用endl强制执行刷新,然后再执行第二条指令。您还可以使用ostream::flush函数确保使用。

答案 2 :(得分:-2)

endl是一个函数而不是关键字。

#include <iostream>
int main()
{
 std::cout<<"Hello World"<<std::endl;  //endl is a function without parenthesis.
 return 0;
}   

要了解endl的图片,首先需要了解&#34;指向函数的指针&#34;主题。

查看此代码(在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中; 或者您也可以使用&#34;使用命名空间std&#34;在顶部,所以你不必写&#34; std :: coutn&lt;&lt; .....&#34;在每个cout或endl之前。

当您在没有paranthesis的情况下编写endl时,您将函数endl的地址赋予cout,然后调用endl函数并更改行。 背后的原因是

namespace endl
{
printf("\n");
}

结论:在C ++背后,C的代码正在运行。