为何printf在循环不同位置会自动刷新或需手动刷新?
为什么printf的输出行为随位置变化?
这本质是标准输出(stdout)的缓冲机制在起作用,核心逻辑如下:
- 标准输出默认采用行缓冲模式:只有遇到换行符
\n、缓冲区被填满、程序退出,或者手动调用fflush(stdout)时,才会把缓冲区里的内容真正输出到终端。
接下来看两个位置的具体差异:
1. printf放在循环开头时
这个位置的printf会被高频调用——循环里的continue会让程序每秒重复执行成百上千次这个printf。每次printf输出\r+一个符号,共2个字符,很快就会填满stdout的默认缓冲区(通常为4096字节),触发自动刷新。所以看起来像是“自动刷新”,实际是高频输出把缓冲区撑满,系统被迫将内容输出到终端。
2. printf放在continue之后时
这个位置的printf每秒仅执行一次,每次输出2个字符,距离填满缓冲区相差甚远。行缓冲模式下既没有换行符触发刷新,也没达到缓冲区满的条件,所以内容一直存放在缓冲区里,无法在终端看到输出。必须手动添加fflush(stdout),强制将缓冲区内容刷到终端,才能显示效果。
额外补充:如果通过setvbuf(stdout, NULL, _IONBF, 0)将stdout设置为无缓冲模式,无论printf放在哪个位置,都会立刻输出内容,但终端环境下默认是行缓冲模式,因此才会出现上述差异。
内容的提问来源于stack exchange,提问作者user13456653
相关产品推荐
相关产品推荐

