c 中的标准输出缓冲区意外刷新自身

Ngu*_*ơng 4 c stdout

我刚刚了解了 C 中的流缓冲。据我了解,printf()C 中是缓冲的,并且仅在遇到新行、缓冲区已满或我们stdout手动刷新时才打印。然后我尝试这些代码行:

#include <stdio.h>

int main() {
    printf("Hello world");
    while(1);
}
Run Code Online (Sandbox Code Playgroud)

理论上,控制台不会收到任何内容,因为Hello world仍在缓冲区中。但由于某些原因,我的控制台仍然显示该字符串。为什么会这样呢?

编辑:我在 Windows 10 中使用命令提示符。

chu*_*ica 5

\n

printf()在 C 中是缓冲的,只有在遇到新行时才打印

\n
\n

不完全的。

\n

流通常是以下 3 种模式之一:无缓冲完全缓冲行缓冲。通常stdout行缓冲,在打印 a 时刷新数据'\\n',其内部缓冲区已满或由于诸如 之类的显式命令fflush(stdout)

\n

然而 C 指定了这 3 种模式:对这些特性的支持是实现定义的。C17dr \xc2\xa7 7.21.3 3.

\n

因此,看到输出和不看到输出都符合OP的代码。

\n

为了确保看到输出,请冲洗。否则,就接受实现定义的行为。

\n
printf("Hello world");\nfflush(stdout); // add\nwhile(1);\n
Run Code Online (Sandbox Code Playgroud)\n