if语句在内部,而依赖于依赖的同一个变量

时间:2017-07-05 06:48:31

标签: 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++); 
    }
}

虽然这样做

#include <stdio.h>
int main() {
    int i = 0;

    while(i < 10) {
        if(i < 7)
            printf("value is%d\n", i++);
    }
}

3 个答案:

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