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

Ste*_*ven 0 c++ c++11

我遇到了一个可怕的情况.我通常使用可视代码编辑我的代码,也可以在其中编译和执行(F5).但我发现vscode太聪明或者忽略了一些警告信息.并输出正确的答案,这在Ideone中也可以正常工作.但是在窗口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]);
}
Run Code Online (Sandbox Code Playgroud)

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

所以我想知道

  1. 有什么办法让我的vscode更严格吗?

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

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

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

Lig*_*ica 10

编译器或计算机无法读懂你的想法并猜测你的写作意图而不是你真正的意思.

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

即使这个错误导致程序具有未定义的行为,也不可能检测到许多未定义行为的情况,并且编译器作者尝试编写代码来执行此操作是不值得的,因为它太难并且不够有用.即使他们这样做了,编译器仍然无法猜测你的意思.

请记住,循环像这样不具备检查或增加您在序言中声明相同的变量; 这只是一种常见的模式(现在被更安全的ranged-for语句所取代).有一个循环增加i但检查没有任何内在错误j.

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

请记住集中注意力并密切关注并阅读您的代码,最终这种拼写错误将在您的工作中变得不那么常见.当然有一段时间你会写一个bug,你的测试会抓住它.有时您的测试无法捕获它,这是您的客户最终会注意到并提出投诉的时间.然后,您发布一个修复该错误的新版本.

这完全是正常的软件开发实践.这就是让它变得有趣的原因!