考虑以下计划。 我想知道为什么这些代码以不同的方式表现。提前谢谢。
这不打印任何
#include <stdio.h>
int main() {
int i = 0;
while(i < 10) {
if(i < 7)
printf("value is%d", i++);
}
}
虽然这样做
#include <stdio.h>
int main() {
int i = 0;
while(i < 10) {
if(i < 7)
printf("value is%d\n", i++);
}
}
答案 0 :(得分:5)
首先请注意,您的程序永远不会退出。当i
点击7
时,游戏结束,你的卡住将永远无所事事。
第二个注意事项唯一的区别是打印一个新行。这应该是你的线索。由于循环是无限的,你永远不会打印新的行或退出 - 两个东西都冲洗STDOUT。在你刷新STDOUT之前,你只是在积累你试图在缓冲区中打印的内容。只有冲洗才会在屏幕上显示,并清洁缓冲区。
@chux增加了一个好点:
STDOUT(或IN或ERR)的缓冲是实现定义的,意味着Linux,Windows等的不同风格可能显示不同的行为。显然在OP STDOUT中是缓冲的 - 因为没有输出。
答案 1 :(得分:2)
当您使用printf()
时,它只是将您的数据放入STDOUT
缓冲区,其目的不是显示在屏幕上。但是如果在屏幕上刷新\n
缓冲区,则在printf()
内使用STDOUT
。如果您不使用fflush()
,也可以使用\n
。
来自fflush()
man页面
对于输出流,fflush()强制写入所有缓冲的用户空间 通过流的底层提供给定输出或更新流的数据 写功能。对于输入流,fflush()会丢弃所有缓冲数据 已经从底层文件中获取但尚未得到的 应用程序对此感到满意。流的开放状态不受影响。
答案 2 :(得分:0)
请阅读this。
例如,简单地包括&#34; \ n&#34;在打印的东西中通常会刷新它(因为stdout默认是在连接到终端时进行行缓冲)。
#include<stdio.h>
int main() {
int i=0;
while(i<10) {
if(i<7)
printf("value is%d",i++);
fflush(stdout);
}
}