Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C while中的if语句依赖于while所依赖的同一变量_C_Loops_If Statement_While Loop_Conditional - Fatal编程技术网

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);
    }
}