C 为什么printf()后面的行是对sleep()的调用,在打印任何内容之前执行?

C 为什么printf()后面的行是对sleep()的调用,在打印任何内容之前执行?,c,printf,sleep,C,Printf,Sleep,我以为我在做一些简单的事情,但C决定对我进行异步。我不知道发生了什么事。这是我的密码: #include <stdio.h> int main() { printf("start"); sleep(5); printf("stop"); } #包括 int main(){ printf(“开始”); 睡眠(5); printf(“停止”); } 当我编译和运行时,我注意到sleep(5)的工作方式很有魅力。但是编译器认为跳过第一个printf()并使其无序

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

#include <stdio.h>
int main() {
    printf("start");
    sleep(5);
    printf("stop");
}
#包括
int main(){
printf(“开始”);
睡眠(5);
printf(“停止”);
}
当我编译和运行时,我注意到
sleep(5)
的工作方式很有魅力。但是编译器认为跳过第一个
printf()
并使其无序是个好主意,因此在运行时,程序会等待5秒钟,然后打印
startstop

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


谢谢

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

#include <stdio.h>
int main() {
    printf("start");
    fflush(stdout);
    sleep(5);
    printf("stop");
}
#包括
int main(){
printf(“开始”);
fflush(stdout);
睡眠(5);
printf(“停止”);
}


另请参见

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

#include <stdio.h>
int main() {
    printf("start\n");
    sleep(5);
    printf("stop\n");
}
#包括
int main(){
printf(“开始\n”);
睡眠(5);
printf(“停止\n”);
}

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

可能重复的可能重复的谢谢!我早该知道还有更多。起初,我以为我有一个流氓Python安装,它嫉妒这个C程序在语法简洁性方面与其实现相抗衡。