【发布时间】:2020-04-07 20:18:37
【问题描述】:
我读过很多人问为什么 printf 在 while 循环之前不起作用;答案是它没有刷新标准输出,因为它们的格式字符串中没有换行符。但是,以下简单代码仍然没有为我产生输出:
#include <stdio.h>
int main() {
printf("Hello world!\n");
while (1);
return 0;
}
但是,在 printf 调用之后添加 fflush(stdout); 会产生输出。换行符应该是不必要的,那为什么没有它就行不通呢?
【问题讨论】:
-
我不复制。你的系统是什么?你如何调用你的程序?
-
@user3121023 @AProgrammer 我在 Windows 上使用 mingw 和 Eclipse。但是,如果我省略了 while 循环,那么在没有
fflush(stdout);的情况下输出会非常好。 -
为什么你认为换行符让它变得不必要了?有很多因素。在某些常见情况下,以换行符结束字符串会导致标准库函数刷新流。正如您所发现的,并非总是如此。所以不要依赖隐含的行为。如果要刷新流,请刷新它。
-
您的运行时没有将 Eclipse 的输出视为交互式设备,因此会进行完全缓冲。我对 Windows 和 Eclipse 的了解不够多,无法进一步评论,但 IMO 这是您的代码以外的其他地方的错误。
-
"换行符应该是不必要的," --> 不正确的结论。取决于缓冲模式。见What are the rules of automatic stdout buffer flushing in C?。