【问题标题】:How does the infinite loop further down stop earlier code from execution?无限循环如何进一步阻止早期代码的执行?
【发布时间】:2020-03-13 22:19:08
【问题描述】:

我遇到了这种奇怪的情况,我无法解决。在下面的代码中,程序显然进入了无限循环,但不执行之前的代码。

#include <stdio.h>
#include <stdlib.h>

int main() {
    char buf[100];

    if (scanf("%s", buf)==EOF)  return 0;

    printf("This does not get printed");

    while(1) {} //infinite loop
    return 1;
}

不知何故,即使在按下enter 或使用Ctrl-d 之后,printf 命令也不会执行。 但是,似乎代码最终会陷入无限循环。

有人解释这里发生了什么吗?我正在使用 gcc。

【问题讨论】:

  • 在末尾添加“\n”,然后重试。
  • 它不会停止早期的代码,它会停止清除标准输出缓冲区的退出时清理代码。
  • 另外,如果你用优化编译,编译器可能会交换语句的位置,只要它们不相互影响。
  • 该死!有了额外的“\n”,我真的在我的屏幕上得到了这条线。显然新行会刷新标准输出缓冲区?
  • 输出被缓冲。如果您不想等待,只需在printf 之后调用fflush(stdout),这将导致标准输出被刷新,并且 printf 的结果将立即出现。

标签: c infinite-loop


【解决方案1】:

标准输出默认为行缓冲。如果您在输出中写入的行少于一行,则可能会延迟部分或全部内容,直到出现更多输出。

【讨论】:

  • 或者输入是请求。
  • 或者行增长大于缓冲区大小,但随后可能只有部分行被刷新
猜你喜欢
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-09
  • 1970-01-01
  • 2012-11-09
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多