【问题标题】:Why does my cpp program hang up after first line?为什么我的 cpp 程序在第一行之后就挂断了?
【发布时间】:2019-06-05 10:15:58
【问题描述】:

我在 cpp 中有这段代码,我正在为一个竞争性编码问题编写代码。 这段代码似乎在第一行之后就停止工作了。即使我删除第一行,代码也会在第二行挂起。我的 CPU 嗡嗡作响,好像我陷入了无限循环。这两行都不能启动无限循环。

请看这里:https://imgur.com/N4YZnCi

查看正在打印的行号。

然后我删除了我认为可能会造成麻烦的行。但随后代码似乎就挂断了。

看到这个:https://imgur.com/uZZeYFE

#include<bits/stdc++.h>

    #define line cout<<__LINE__<<"\n"; //this prints the line number in code

using namespace std;

int main() {
line  //This prints

ios_base::sync_with_stdio(false); cin.tie(NULL); 

line //This doesn't print at first

freopen("input.txt", "r", stdin); freopen("output.txt", "w", stdout);

line //This doesn't print in both attempts.
...
}

这在以前从未发生过。我不明白的是,即使我可能在其他地方犯了一些错误,我也从来没有碰过这两行。这是我的竞争编码模板。这两行不应该独立于其余代码吗?

【问题讨论】:

  • 什么是...ios_base::sync_with_stdio(false); cin.tie(NULL); 精确实现了在请求输入时可能不会刷新输出。因此,打印不是您查看程序评估位置的方式,因为程序可能在显示任何内容之前正在执行...。请发帖minimal reproducible example
  • “这是我的竞争编码模板。”把它扔掉。此示例中只有两行我会在代码审查中接受:int main() {}
  • 如果在程序执行其第一个输入或输出操作之前调用它,则打开或关闭所有 iostream 标准流与其对应的标准 C 流的同步。如果在发生输入或输出操作后调用,则其效果由实现定义。
  • 如果你使用神秘的魔法咒语而不了解它们的作用,就会发生奇怪的事情。 (如果你的程序在没有“不同步”的情况下太慢,问题出在你的算法上,而不是 I/O 上。从劣质算法中减少微秒是没有竞争力的。)

标签: c++


【解决方案1】:

您在写信后立即将std::coutstdout 断开连接。 cppreference has this to say:

如果在标准流上发生 I/O 后调用此函数,则行为由实现定义:实现范围从无效到破坏读取缓冲区。

【讨论】:

  • 很好。但即使在注释掉该行之后,问题仍然存在。
  • 您可能会在未显示的代码中使用(未|实现-)定义的行为进行其他操作。如果是未定义的行为,可以travel through time
猜你喜欢
  • 1970-01-01
  • 2015-03-19
  • 1970-01-01
  • 1970-01-01
  • 2021-10-08
  • 1970-01-01
  • 1970-01-01
  • 2015-06-01
  • 1970-01-01
相关资源
最近更新 更多