C++:为什么此代码仅在使用“\n”时才有效?

EVA*_*ATE 4 c++ delay

在 Ubuntu 18.04 上使用 g++ 编译时,以下 C++ 代码工作正常:

#include <iostream>

using namespace std;

void wait(){
  int t0 = time(0);
  while(true){
    if(time(0) >= t0 + 1){
      return;
    }
  }
}
int main(){
  while(true){
    cout << "tick\n";  //Line 15
    wait();
  }
}
Run Code Online (Sandbox Code Playgroud)

这是tick每秒出现一个的输出:

tick
tick
tick
tick
tick
Run Code Online (Sandbox Code Playgroud)

但是,当删除第\n15 行中的它时,它似乎只是卡在某处而没有任何反应。\n代码到底做了什么?如果我不想在每个循环后都打印新行,我该怎么办?(我认为将其称为 C++ 中的错误会有点傲慢和错误)

另外,我知道这可能是构建延迟功能的一种非常糟糕的方式,我只是在胡闹。

Som*_*ude 10

似乎您std::cout对 C 输出流的写入实现stdout。并且stdout默认情况下(当连接到终端时)line-buffered

行缓冲意味着输出在内部进行缓冲,直到将换行符 ( '\n') 添加到缓冲区。然后缓冲区被刷新并实际写入终端。


您可以使用 C++ I/O 操纵器显式刷新缓冲区std::flush,如

cout << "tick" << std::flush;
Run Code Online (Sandbox Code Playgroud)

这将立即刷新缓冲区并将其写入终端。但是没有换行符。要添加换行符,您可以使用std::endl

cout << "tick" << std::endl;  // Add newline and flush
Run Code Online (Sandbox Code Playgroud)

但请注意,此处不需要显式额外刷新,因为换行符本身会刷新缓冲区。std::endl因此,由于换行符,Using将首先刷新缓冲区一次,然后由于显式刷新语义而刷新空缓冲区。

建议您不要使用std::flush(或std::endl),除非您真的必须这样做。在大多数情况下,它并不是真正需要的。

  • 我相信,添加一些关于 `std::flush` 和 `std::endl` 的内容会改善答案。 (2认同)
  • 另请参阅 [std::flush 如何工作?](/sf/ask/987395531/) 了解行缓冲区何时自动刷新的详细信息。 (2认同)