将换行符添加到printf()等效于刷新流吗?

以下程序显示当发生“除以零”之类的错误时,缓冲的I / O如何导致程序出现问题:

int main() { int a = 1, b = 0, c; printf("Dividing..."); c = a/b; printf("Answer is: %d\n", c); return 0; } 

输出是Floating point exception (core dumped)

很公平。 但令人惊讶的是,如果我将第一个printf更改为printf("Dividing...\n"); ,这个文本实际上是在程序崩溃之前打印的(顺便说一下,我在Linux上运行GCC)。

我是否可以得出结论,添加换行符相当于刷新? 如果是这样,如果我的所有printf()字符串都以\n结尾,我实际上是在剥夺自己缓冲I / O的好处?

如果您的标准输出要转到终端,是的,它等于刷新,因为printf()将使用基于行的缓冲。

如果它被重定向到一个文件,那么没有。 在这种情况下, printf()使用更大的缓冲区,通常对应于文件系统块大小或其他,以优化IO。