c++ - C++ for 循环继续循环,即使它不应该
问题描述
int inc = swap ? 1 : -1;
for(int j=j1; j!=j2; j+=inc){
if(j < 0)
j = curve2->controlPoints()->size()-1;
if(j >= curve2->controlPoints()->size())
j = 0;
curve->addControlPoint(curve2->controlPoint(j)->pos(), curve2->controlPoint(j)->triangle());
}
我发现在某些情况下,这个 for 无限循环。使用调试器查看时, j 确实到达 j2 但由于某种原因继续循环。
然后我尝试在循环内添加一个中断 if j == j2 (技术上是 j-inc,因为 j 在它再次进入循环时会增加)
for(int j=j1; j!=j2; j+=inc){
if (j - inc == j2)
{
qDebug() << "break =================================";
break;
}
if(j < 0)
j = curve2->controlPoints()->size()-1;
if(j >= curve2->controlPoints()->size())
j = 0;
curve->addControlPoint(curve2->controlPoint(j)->pos(), curve2->controlPoint(j)->triangle());
}
这样做确实解决了问题(并且确实打印了“中断”),但这真的没有任何意义吗?为什么第一个 for 循环会这样?
编辑:我正在迭代列表的一部分(在值 j1 和 2 之间)。根据交换参数(布尔值),迭代可以同时进行。如果 j 到达列表的末尾之一,它会在另一侧继续(例如,如果 j1=5,j2=1 并且列表大小为 7,j 将采用以下值:5 6 0 1)
解决方案
应该注意的是,我只是猜测这里会发生什么......
我的猜测是,通过其中一项分配,它j
变得等于j2
循环内部。但是随后增加j += inc
发生并且j
不再等于j2
检查循环条件的时间。
一般来说,一个for
循环相当于一个while
循环:
for (a; b; c)
d
相当于
{
a;
while (b)
{
d;
c;
}
}
这意味着您的第一个循环等于(添加了额外的注释)
{
int j = j1;
while (j != j2)
{
if(j < 0)
j = curve2->controlPoints()->size()-1;
if(j >= curve2->controlPoints()->size())
j = 0;
curve->addControlPoint(curve2->controlPoint(j)->pos(), curve2->controlPoint(j)->triangle());
// At this point `j == j2`, so the loop condition is false
// BUT then you do
j += inc;
// Here `j != j2` again, and the loop condition is true and will continue
}
}
也许您的循环条件应该是j - inc == j2
?
推荐阅读
- kotlin - 带有 diffutil 的 recyclerview 中的 submitList() 导致 recyclerview 闪烁
- azure - Azure Function App VS 2019 .NET 3.0 中的错误 - 找不到方法:'IFunctionsHostBuilder.get_Services()'
- c# - CefSharp winfoms 页面加载并等待
- ios - iOS - 日期打印前一天
- php - 如何使用 .htaccess 将某些类型的 URL 更改为另一种类型?
- node.js - 文件域上“Node app.js”的等价物是什么?
- c# - MVC 核心,将根视图文件夹更改为 UI,出现“默认身份 UI 布局需要部分视图 '_LoginPartial'”错误
- c# - 从 .Net Core 3.0 预览版升级到 .Net Core 3.0 版本后启动时出错
- c# - 基于列表类型的属性对列表进行二分搜索
- javascript - 如何在javascript中停止减值为零