为什么在c ++中使用ios :: sync_with_stdio(false)后在cout之前执行printf?

0 c++ output

#include <iostream>
#include <stdio.h>


int main () {
  std::ios::sync_with_stdio(false);
  std::cout << "hi from c++\n";
  printf("hi from c\n");
  return 0;
}
Run Code Online (Sandbox Code Playgroud)

删除std :: endl并在\ out语句中放置\ n后,输出更改为以下内容:

hi from c
hi from c++
Run Code Online (Sandbox Code Playgroud)

Som*_*ude 8

这是一个缓冲问题。

默认情况下,当标准输出连接到端子时,stdout行缓冲的,这意味着缓冲区已刷新,并且输出实际在换行符上写入到端子。

当C stdio与C ++标准流断开连接时,std::cout将对其进行完全缓冲,这意味着在显式刷新(使用例如std::flushstd::endl操纵器)或缓冲区已满时实际写入输出。

C stdout和C ++ 使用的两个缓冲区std::cout是不同的,并且没有连接。

程序退出时也会发生缓冲区刷新。


程序中发生的事情是,printf由于字符串中尾随换行符,带有的输出会立即被刷新。但是std::cout仅在程序退出时才刷新输出到。