C 为什么write()在printf()之前执行?它不是按顺序排列的吗?

C 为什么write()在printf()之前执行?它不是按顺序排列的吗?,c,printf,sequential,C,Printf,Sequential,代码如下: #include <stdio.h> #include <unistd.h> void main(){ char str1[18]= "moo\0 cuek\n"; printf("lel: %s",str1); write(STDOUT_FILENO,str1,18); write(STDOUT_FILENO,"meow ",19); } 还有,为什么先印“喵喵”,然后再印第二行 当我将\n放入printf中时,请注意

代码如下:

#include <stdio.h>
#include <unistd.h>

void main(){
    char str1[18]= "moo\0 cuek\n";
    printf("lel: %s",str1);

    write(STDOUT_FILENO,str1,18);
    write(STDOUT_FILENO,"meow ",19);

}
还有,为什么先印“喵喵”,然后再印第二行

当我将\n放入printf中时,请注意:

printf("lel: %s \n",str1);
我得到:

lel:moo
moo cuek
meow moo cuek

为什么

我不知道细节,但基本上大多数写入控制台的函数都是缓冲的。这意味着当您调用函数时,文本打印时并不一定是这样。 见: 这里

printf("lel: %s",str1);
printf在文件流上打印数据,其中它的点和默认值是stdout stream,stdout stream是行缓冲的,即您需要通过调用fflushstdoutor adding\n char来刷新缓冲区。例如

printf("lel: %s",str1);
fflush(stdout);

或者可以通过调用setbuf禁用缓冲

在这里

 write(STDOUT_FILENO,str1,18);

write是一个没有缓冲IO的系统调用,即它不缓冲数据,因此它会立即将数据写入标准输出文件号。

提示:什么是“缓冲IO”?
printf("lel: %s\n",str1); /* newline char has another use apart from giving newline i.e clear the buffer */
 write(STDOUT_FILENO,str1,18);