首页 > 解决方案 > C++:为什么这段代码只在使用'\n'时才有效?

问题描述

在 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();
  }
}

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

tick
tick
tick
tick
tick

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

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

标签: c++delay

解决方案


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

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


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

cout << "tick" << std::flush;

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

cout << "tick" << std::endl;  // Add newline and flush

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

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


推荐阅读