首页 > 解决方案 > 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)

标签: c++qt

解决方案


应该注意的是,我只是猜测这里会发生什么......

我的猜测是,通过其中一项分配,它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


推荐阅读