【问题标题】:Brackets causing Infinite Loop导致无限循环的括号
【发布时间】:2014-01-29 01:39:38
【问题描述】:

与三个For循环相关的括号导致函数无限循环,

void Bubblesort (char ulist[27], char slist[27], int n)
{
int i,j;
char temp;
for (i=1;i<=n;i++)
{
    slist[i] = ulist[i];
    for (j=1; j <= n-1 ;j++)
    {
        for (i = 1; i <=n-j;i++)
        {     
            if (slist[i] < slist[i+1])
            {

                temp = slist[i];
                slist[i] = slist[i+1];
                slist[i+1] = temp;
            }

            }
        }
    }
}

虽然没有括号;函数结束。

void Bubblesort (char ulist[27], char slist[27], int n)
{
int i,j;
char temp;
for (i=1;i<=n;i++)
    slist[i] = ulist[i];
    for (j=1; j <= n-1 ;j++)
        for (i = 1; i <=n-j;i++)
            if (slist[i] < slist[i+1])
            {
                cout << "Step 4";
                temp = slist[i];
                slist[i] = slist[i+1];
                slist[i+1] = temp;
            }



}

有人能解释一下原因吗?

【问题讨论】:

  • 最里面和最外面的for 循环都使用相同的索引变量i。对于 3 个循环,使用 3 个变量,例如i, j, k.

标签: c++ for-loop infinite-loop brackets


【解决方案1】:

您更改了循环的语义,并且您的缩进具有误导性。

void Bubblesort (char ulist[27], char slist[27], int n)
{
    int i,j;
    char temp;
    for (i=1;i<=n;i++)
        slist[i] = ulist[i];
        for (j=1; j <= n-1 ;j++)
            for (i = 1; i <=n-j;i++)
                if (slist[i] < slist[i+1])
                {
                    cout << "Step 4";
                    temp = slist[i];
                    slist[i] = slist[i+1];
                    slist[i+1] = temp;
                }
}

应该缩进

void Bubblesort (char ulist[27], char slist[27], int n)
{
    int i,j;
    char temp;
    for (i=1;i<=n;i++)
        slist[i] = ulist[i];

    for (j=1; j <= n-1 ;j++)
        for (i = 1; i <=n-j;i++)
            if (slist[i] < slist[i+1])
            {
                cout << "Step 4";
                temp = slist[i];
                slist[i] = slist[i+1];
                slist[i+1] = temp;
            }
}

【讨论】:

    【解决方案2】:

    问题在于,如果没有括号,您实际上并没有嵌套 for 循环。考虑

    for (i=1;i<=n;i++)
        slist[i] = ulist[i];
        for (j=1; j <= n-1 ;j++)
    

    没有括号,只有 slist[i] = ... 行作为第一个 for 循环的一部分执行。第二个 for 循环作为一个完全独立的实体执行

    一旦循环组合在一起,虽然最外层和最内层循环使用相同的索引变量。它们对价值的相互变化共同创造了一个无限循环。尝试为每个 for 循环使用不同的索引变量,它将解决问题。这在没有括号的情况下有效,因为我描述的初始错误导致第一个和最后一个循环没有嵌套,因此它们不会同时操作相同的值

    【讨论】:

      【解决方案3】:

      这两个函数有不同的算法。在第一个函数中,您有三个嵌套循环。第三个循环使用与第一个循环相同的控制变量“i”。所以循环是无限的,因为在第三个循环之后 i 总是等于 2。

      在第二个函数中,第一个循环是一个单独的循环,其他两个循环没有嵌套在第一个循环内。所以在第三个循环中改变控制变量'i'不会影响第一个循环。

      【讨论】:

        猜你喜欢
        • 2020-08-27
        • 2021-05-07
        • 2012-08-24
        • 2020-11-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多