【问题标题】:Code not working as expected in Linux g++? [closed]代码在 Linux g++ 中没有按预期工作? [关闭]
【发布时间】:2013-01-30 18:31:00
【问题描述】:

在linux g++编译器中,不打印第三个数字,也不打印“reached”。 但我预计会打印“到达”,然后它会进入无限循环。 它使用代码块在 Windows 上按预期执行

#include <iostream>
int main()
{
    int a;
    for (int i = 0; i < 3; i++) {
        std::cin >> a;
        std::cout << a;
    }
    std::cout << "reached";
    while (1) {}
    return 0;
}

【问题讨论】:

  • 第三个数字不打印是什么意思? cin&gt;&gt;a 没有打印任何数字
  • 我不知道你为什么在里面放一个无限循环,但这不是一个好主意。
  • 建议将标题更改为“这段代码有什么问题?”
  • 我不太理解这里的反对意见,但除此之外请不要使用using namespace std; 一开始可能看起来更容易,但它完全破坏了这个概念命名空间,如果在其他程序员以后可能使用的头文件中使用会导致麻烦!不要这样做,即使很多例子都包含这一行。
  • 首先,我认为你使用的IDE并不重要,重要的是你在编译过程中使用的工具链。 for 循环只有 3 个步骤,然后你放入了一个无限循环。在使用的 g++ 编译器中,您可以获得在 for 循环终止后打印的“reached”。

标签: c++ linux compiler-construction output


【解决方案1】:

"reached" 被写入内部缓冲区,但不写入控制台。通常,缓冲区会在每个换行符中写入控制台。如果您不想要换行符,请刷新缓冲区(即将其写入控制台可见):

cout<<"reached"<<flush;

如果你想要换行符,请使用endl:

cout<<"reached"<<endl;

【讨论】:

  • 我曾经被告知系统会不时刷新。这是真的吗?
  • @Ceasar:某些流在给定换行符时会刷新(cout 将在大多数实现中,不是全部)。缓冲流将在存储“足够”字符时刷新,但我不知道在任何实现中它有多大,尽管我希望它在 80 到 4096 字节之间。显然,不刷新的流(stringstream)永远不会刷新。
  • @Caesar 当输出缓冲区已满时,所有系统都会刷新。除非你也告诉他们,否则很少有人会冲洗。我们使用std::endl 的原因之一是因为它会刷新(而只是输出'\n' 不会)。
【解决方案2】:

因为您永远不会结束程序,因此永远不会刷新您的 stdout (cout) 输出。

你可以改变:

 cout<<"reached";

到:

 cout<<"reached" << endl;

或:

 cout<<"reached" << flush;

或者干脆删除你的永远循环。

另一种选择是使用cerr &lt;&lt; "reached"; - 将立即打印,因为cerr 没有缓冲。

【讨论】:

  • 技术上:它是“单元缓冲的”。该实现不会将每个单独的字符推送到系统,但它会在每个 &lt;&lt; 运算符(或像 std::ostream::put 这样的无格式写入)的末尾刷新。
【解决方案3】:

这与cout 的缓冲有关。在进入无限循环之前,将std::endlstd::flush 写入cout 以刷新缓冲区。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-08-21
    • 2016-06-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多