为什么这个循环是无限的

Why is this loop infinite?

本文关键字:无限 循环 为什么      更新时间:2023-10-16

我有一些用于绘制多边形边的代码,例如,在顶点为 0、1 和 2 的三角形中绘制边 (0, 1)、(1, 2) 和 (2, 0)。我以为我可以像这样完成:

for(size_t j = 0, k = 1; j <= vertices.size()-1; j++, k++){
 if(j == vertices.size()-1){k = 0;} //For j to k final edge
...
//draw edges, etc. 
...
}

。但这会使k值爆炸成无限循环。我已经查看了一下,并怀疑问题可能出在我的索引中,但如果一切都取决于 j,我会认为 vertices.size() 可能搞砸了。我是否在此代码中遗漏了某些内容,或者我应该更仔细地查看实际的顶点向量?

你不需要计算 k :

size_t const count = vertrices.size()
for(size_t j = 0; j < count; j++) {
  size_t k = (j + 1) % count;
  // draw
}

这样kj+1,除非 j 是最大值,在这种情况下它是 0。

如果你

不确保vertices至少有一个条目,减法vertices.size()-1可能会导致下溢(即减法size_t(0)-1的非常大的值),你的循环可能会比你想要的长得多。

一个更惯用的解决方案是循环

for (size_t j = 0, k = 1; j < vertices.size(); j++, k++) {
 if ( j == vertices.size()-1) { //works, vertices has at least one entry
   k = 0;
 }
...
//draw edges, etc. 
...
}

如果向量"顶点"为空,则循环将近似无限。您在条件中使用无符号整数算术,因此 -1 将0xFFFFFFF或更大。

如果除了你在这里给出的之外的所有内容都是正确的,它就不会是无限循环。因此,最好的答案是仔细检查代码的其他部分。