【问题标题】:if statement inside while that depends on the same variable that while depends onif 里面的 if 语句依赖于 while 依赖的同一个变量
【发布时间】:2017-12-08 16:27:46
【问题描述】:

考虑以下程序。 我想知道为什么这些代码的行为方式不同。提前谢谢你。

这不会打印任何内容

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

【问题讨论】:

  • 它叫冲洗
  • 默认情况下标准输出是行缓冲的。这意味着(除非您填充一些内部缓冲区),它实际上不会打印任何内容,直到您打印换行符、刷新标准输出或程序退出(这会强制刷新标准输出)。您的第一个程序从不打印换行符、刷新标准输出或退出。
  • 程序终止时也会发生刷新。但是由于您的程序永远不会停止,因此不会发生这种情况。

标签: c loops if-statement while-loop conditional


【解决方案1】:

首先请注意,您的两个程序都不会退出。当i 命中7 时,游戏结束,您将永远无所事事。

第二个注意,唯一的区别是打印一个新行。那应该是你的线索。由于循环是无限的,您永远不会打印新行或退出 - 这两件事都会刷新 STDOUT。在刷新 STDOUT 之前,您只是在缓冲区中累积要打印的内容。只有冲洗才能在屏幕上显示它,并清理缓冲区。

@chux 补充了一个好点:

STDOUT(或 IN 或 ERR)的缓冲是由实现定义的,这意味着不同风格的 Linux、Windows 等可能会显示不同的行为。显然在 OP STDOUT 中是缓冲的 - 因为没有输出出现。

【讨论】:

  • 我认为,C语言不要求exit刷新...我错了吗?
  • 我现在检查了,是的,需要明确的exit 才能刷新Next, all open streams with unwritten buffered data are flushed, all open streams are closed, and all files created by the tmpfile function are removed.
  • "在刷新 STDOUT 之前,您只是在缓冲区中累积要打印的内容。" --> 也许。它是实现定义的行为。 stdout 可能会在各种条件和模式下打印出来,不一定只是累积。见What are the rules of automatic flushing stdout buffer in C?
  • @chux 正确,但它只会在“刷新”时“打印”。我只是给出了常见的情况。显然,在 OP 示例中没有刷新 STDOUT。
  • 不同意“冲洗”时仅“打印”。当打印发生时没有“刷新”,这是实现定义的行为。使用 `"flush" 可以很好地定义行为。
【解决方案2】:

当您使用printf() 时,它只是将您的数据放入STDOUT 缓冲区,其目的不是显示在屏幕上。但是当您在printf() 中使用\n 时,如果刷新屏幕上的STDOUT 缓冲区。如果您不使用\n,也可以使用fflush()。 来自fflush()man页面

对于输出流,fflush() 强制写入所有缓冲的用户空间 通过流的底层给定输出或更新流的数据 写函数。对于输入流, fflush() 丢弃任何缓冲数据 已从基础文件中获取,但尚未配置 由应用程序总结。流的打开状态不受影响。

【讨论】:

    【解决方案3】:

    请阅读this

    例如,简单地在打印的内容中包含“\n”通常会刷新它(因为标准输出在连接到终端时默认是行缓冲的)。

    #include<stdio.h>
    int main() {
        int i=0;
        while(i<10) {
            if(i<7)
                printf("value is%d",i++);
            fflush(stdout);
        }
    }
    

    【讨论】:

      猜你喜欢
      • 2013-09-28
      • 2018-04-05
      • 1970-01-01
      • 2011-09-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多