如何让我的编译器更愚蠢(索引错误)

How to let my compiler more stupid (wrong index)?

本文关键字:索引 错误 我的 编译器      更新时间:2023-10-16

我遇到了一个可怕的情况。我通常使用可视化代码来编辑我的代码,也在其中编译和执行(F5)。但我发现vscode太聪明了,或者忽略了一些警告信息输出正确的答案,这在Ideone中也很有效但在windows cmd或dev C++中,我的代码无法输出任何内容,只能返回一个大数字

我发现一些情况会发生我上面提到的事情。

像这个的代码

for (i = 0; i < g.size(); i++)
{
int source;
int dest;
int minWeight = 999;
for (j = 0; i < g[j].size(); j++)
{
// no edge, come to next condition
if (!g[i][j])
continue;
if (g[i][j] < minWeight)
{
source = i;
dest = j;
minWeight = g[i][j];
}
}
if
updateGroup(index, index[source], index[dest]);
else
updateGroup(index, index[source], index[dest]);
}

您可能会发现第二个for循环有错误的条件语句,它应该更改j = 0; i < g[j].size(); j++j = 0; j < g[i].size(); j++

所以我想知道

  1. 有没有办法让我的vscode更严格?

  2. 为什么它仍然可以在vscode和ideone中输出正确答案?

  3. 当出现这种无消息错误时,如何避免或更容易找到我的代码错误的地方?

真的希望有人能帮助我,并感谢你的所有建议!!

编译器或计算机无法读懂你的想法,猜测你想写什么,而不是你真正的意思。

即使这个错误导致了一个bug,它也不知道你不是有意写这个,或者你打算写其他特定的东西。

即使这个错误导致你的程序有未定义的行为,也不可能检测到许多未定义行为的情况,编译器作者也不值得尝试编写代码来做到这一点,因为这太难了,也不够有用。即使他们这样做了,编译器仍然猜不出你的意思。

记住,像这样的循环不需要来检查或增加您在序言中声明的相同变量;这只是一种常见的模式(现在被更安全的声明范围所取代)。循环递增i但检查j本身并没有什么问题。

最终,这个问题的解决方案是为您的代码编写测试,这就是为什么许多组织都有专门的质量保证团队来搜索错误,以及为什么在将代码提交到项目之前,您应该已经对其进行测试

记住要集中注意力,仔细阅读你的代码,这样的拼写错误最终会在你的工作中变得不那么常见。当然,偶尔你会写一个bug,你的测试会发现它。有时你的测试不会发现它,这时你的客户最终会注意到它并提出投诉。然后,您发布了一个新版本来修复这个错误。

这完全是正常的软件开发实践。这就是它的乐趣所在!

1)尽可能高地启动编译器警告。

2) 使用多个不同的编译器(它们都警告不同的事情)。

3) 很好地了解语言的细节(需要多年的努力),并且对编写的代码要非常非常小心。

4) 编写(并定期运行)大量测试。

5) 使用诸如消毒器、模糊器、linters、静态代码分析器等工具来帮助捕捉错误。

6) 在多个平台上构建和运行代码,以保持其可移植性,并发现不同环境/实现暴露的错误。