C语言代码中printf先执行却在scanf后输出的原因是什么?
C语言printf先执行却晚于scanf输出的原因
这个现象和C标准库的行缓冲机制有关,和CPU执行顺序、编译器本身没有关系。
Linux环境下默认对标准输出(stdout)启用行缓冲策略,规则是:缓冲区的内容只有满足以下三个条件之一时才会真正输出到终端:
- 缓冲区被填满
- 遇到换行符
\n - 执行输入类操作前主动刷新缓冲区
你写的printf("write down any whole number:");末尾没有加换行符\n,内容会先暂存在输出缓冲区里,不会立刻打印到终端。执行scanf的时候,标准库会先刷新输出缓冲区的内容,所以你才会看到先弹出printf的内容,再等待输入,调试时感知到的就是printf的输出比实际执行晚。
解决方法
你可以任选以下一种方式让printf的内容立刻输出:
- 在printf字符串末尾加换行符:
printf("write down any whole number:\n");
- 调用
fflush手动刷新标准输出缓冲区:
printf("write down any whole number:"); fflush(stdout);
- 直接关闭标准输出的缓冲机制:
setbuf(stdout, NULL);
内容的提问来源于stack exchange,提问作者user14479570
相关产品推荐
相关产品推荐

