【问题标题】:C++ for loop continue to loop even though it shouldn'tC++ for 循环继续循环,即使它不应该
【发布时间】:2019-03-08 12:52:11
【问题描述】:
        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。如果该修改导致j != j2从不为真,会发生什么?
  • 那么j1j2swap 的值是什么?您在循环内为j 分配了哪些可能的值?你调用的任何函数会修改j2吗?请创建minimal reproducible example 向我们展示。并且请在循环中迭代时使用调试器检查实际值。
  • 正如我所说,我在迭代循环时使用调试器检查实际值,j 确实等于 j2,但它仍然没有离开循环。
  • 我们看不到调试器的输出,因此您需要向我们展示一个完整的示例。我们无法修复我们看不到的代码。阅读minimal reproducible example
  • 您似乎认为增量发生在条件测试之后,但顺序实际上相反。

标签: c++ qt


【解决方案1】:

需要注意的是,我只是猜测这里发生了什么......

我的猜测j 在循环内通过其中一项分配变为等于j2。但随后增加了j += inc,当检查循环条件时,j 不再等于j2


一般来说,for 循环等价于while 循环:

for (a; b; c)
    d

等价于

{
    a;
    while (b)
    {
        d;

        c;
    }
}

这意味着您的第一个循环等于(添加了额外的 cmets)

{
    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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-07-15
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多