为什么printf()之后的行是对sleep()的调用,在打印之前执行?

我以为我在这里做了一些简单的事情,但C决定对我进行异步操作。 我不确定发生了什么事。 这是我的代码:

#include  int main() { printf("start"); sleep(5); printf("stop"); } 

当我编译并运行时,我注意到sleep(5)就像魅力一样。 但是编译器决定跳过第一个printf()并且出现故障是个好主意,因此在运行时,程序会等待5秒然后打印startstop

这是怎么回事? 我的理论是程序用shell启动打印操作,然后继续执行程序,让Bash等到程序不再忙于实际渲染字符串。 但我真的不知道。

谢谢

printf使用缓冲输出 。 这意味着数据在刷新到输出源之前首先在内存缓冲区中累积,在这种情况下是stdout (通常默认为控制台输出)。 在第一个printf语句之后使用fflush强制它将缓冲的数据刷新到输出源。

 #include  int main() { printf("start"); fflush(stdout); sleep(5); printf("stop"); } 

另请参阅为什么printf在调用后不会刷新,除非换行符在格式字符串中?

尝试在printf语句中添加’\ n’,如下所示:

 #include  int main() { printf("start\n"); sleep(5); printf("stop\n"); } 

编译器没有按顺序执行此操作。 只是输出累积,然后在程序退出时显示。 ‘\ n’将调用tty驱动程序中的行规则来刷新输出。

阅读此问答,它解释了它。