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());
        }

我发现在某些情况下,这是无限的循环。当使用调试器查看时,J确实达到了J2,但出于某种原因继续循环。

我然后尝试在循环内的j == j2(从技术上开始j = 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());
        }

这样做确实解决了问题(确实是印刷的"断裂"),但这没有任何意义吗?为什么第一个循环以这种方式行动?

编辑:我在列表的一部分(值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

最新更新