我遇到了一个可怕的情况。 我通常使用可视代码来编辑代码,并在其中进行编译和执行(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]);
}
您可能会发现第二个for循环的条件语句错误,应该更改
j = 0; i < g[j].size(); j++
至j = 0; j < g[i].size(); j++
所以我想知道
有什么办法让我的vscode更加严格吗?
为什么仍然可以在vscode和ideone中输出正确答案?
当这种无消息错误时,如何避免或更容易找到我的代码错误的地方?
真的希望有人能帮助我,并感谢您的所有建议!
答案 0 :(得分:10)
编译器或计算机无法读懂您的想法并猜测您打算写的内容,而不是您真正的意思。
即使这个错误导致了错误,它也无法知道您不打算写这个,或者您打算写一些其他特定的东西。
即使此错误导致程序具有未定义的行为,也无法检测到许多未定义的行为,对于编译器作者来说,尝试编写代码来执行此操作也不值得,因为这样做太难了,不够用。即使他们做到了,编译器仍然无法猜测您的意思。
请记住,像这样的循环没有检查或增加您在序言中声明的相同变量;那只是一个常见的模式(现在已被更安全的range-for语句所取代)。循环递增i
但检查j
并没有本质上的错误。
最终,解决此问题的方法是为您的代码编写 tests ,这就是为什么许多组织都有专门的质量保证团队来搜索错误的原因,以及为什么您应该已经进行过测试将代码提交到项目之前。
请记住要集中精力并密切注意并阅读您的代码,最终这种错别字在您的工作中将变得越来越少见。当然,有时您会编写一个错误,然后您的测试将捕获该错误。有时您的测试不会捕获该消息,这是您的客户最终会注意到它并提出投诉的时候。然后,您发布修复该错误的新版本。
这都是完全正常的软件开发实践。这就是让它变得有趣的原因!
答案 1 :(得分:2)
1)尽可能提高编译器警告。
2)使用多个不同的编译器(它们都对不同的事物发出警告)。
3)精通该语言的细节(经过多年的努力),对编写的代码要非常非常小心。
4)编写(并定期运行)大量测试。
5)使用消毒剂,模糊器,棉绒,静态代码分析器等工具来帮助捕获错误。
6)在多个平台上构建和运行代码,以使其易于移植并查找不同环境/实现所暴露的错误。