C while中的if语句依赖于while所依赖的同一变量
考虑以下程序。 我想知道为什么这些代码以不同的方式运行。提前谢谢 这不打印任何内容C while中的if语句依赖于while所依赖的同一变量,c,loops,if-statement,while-loop,conditional,C,Loops,If Statement,While Loop,Conditional,考虑以下程序。 我想知道为什么这些代码以不同的方式运行。提前谢谢 这不打印任何内容 #include <stdio.h> int main() { int i = 0; while(i < 10) { if(i < 7) printf("value is%d", i++); } } #包括 int main(){ int i=0; 而(i
#include <stdio.h>
int main() {
int i = 0;
while(i < 10) {
if(i < 7)
printf("value is%d", i++);
}
}
#包括
int main(){
int i=0;
而(i<10){
如果(i<7)
printf(“值为%d”,i++);
}
}
而这是
#include <stdio.h>
int main() {
int i = 0;
while(i < 10) {
if(i < 7)
printf("value is%d\n", i++);
}
}
#包括
int main(){
int i=0;
而(i<10){
如果(i<7)
printf(“值为%d\n”,i++);
}
}
请阅读
例如,仅在打印内容中包含“\n”通常会刷新它(因为在连接到终端时,默认情况下stdout是缓冲行)
#包括
int main(){
int i=0;
虽然(i当您使用printf()
时,它只是将数据放入STDOUT
缓冲区,其目的不是在屏幕上显示。但是当您在printf()
中使用\n
时,if会刷新屏幕上的STDOUT
缓冲区。如果您不使用\n
,也可以使用fflush()
。
从fflush()
页面
对于输出流,fflush()强制写入所有缓冲的用户空间
给定输出或更新流的数据,通过流的底层
对于输入流,fflush()丢弃任何缓冲数据
已从基础文件中获取,但尚未被复制-
由应用程序计算。流的打开状态不受影响
首先请注意,你的两个程序都不会退出。当i
点击7
时,游戏就结束了,你的程序永远不会退出
第二个注意:唯一的区别是打印新行。这应该是你的线索。由于循环是无限的,你永远不会打印新行或退出-这两种情况都会刷新标准输出。在刷新标准输出之前,你只是在一个缓冲区中累积你试图打印的内容。只有刷新才会将其显示在屏幕上,并清理缓冲区
@chux补充了一个很好的观点:
STDOUT(或IN或ERR)的缓冲是实现定义的,这意味着不同风格的Linux、Windows等可能会显示不同的行为。显然,在OP中,STDOUT是缓冲的-因为没有输出出现。它被称为flushingBy的默认STDOUT是行缓冲的。这意味着(除非填充一些内部缓冲),在打印换行符、刷新stdout或程序退出(强制刷新stdout)之前,它实际上不会打印任何内容。您的第一个程序从不打印换行符、刷新stdout或退出。当您的程序终止时,刷新也会发生。但由于您的程序从不停止,这不会发生。我认为,C语言不要求exit
刷新…我错了吗?我现在检查了,是的,需要显式exit
刷新下一步,所有打开包含未写入缓冲数据的流将被刷新,所有打开的流将关闭,所有由tmpfile函数创建的文件将被删除。
“在刷新标准之前,您只是在将要打印的内容累积到缓冲区中。”-->可能。这是实现定义的行为。stdout
可能在各种条件和模式下打印,不一定只是累积。请参阅@chux correct,但它只有在“刷新”时才会“打印”。我只是给出了常见情况。显然,在OPs示例中,stdout没有刷新。不同意仅在刷新时“打印”“flush”。当打印在没有“flush”的情况下进行时,这是实现定义的行为。使用“flush”可以很好地定义该行为。
#include<stdio.h>
int main() {
int i=0;
while(i<10) {
if(i<7)
printf("value is%d",i++);
fflush(stdout);
}
}