如何用结构化的等价替换continue和goto语句?

时间:2015-10-14 06:14:45

标签: c++ loops

我编写了代码,但我的教授说使用continuegoto是不好的做法。我尝试用另一个while循环替换continue语句,但它给了我不正确的输出。 continue和goto语句的结构是什么?

void getrare(int *arr, int *ordered, int len)
{
    for (int index = 0; index < len; ++index)
    {
        int n = arr[index];
        int d = 0;
        while (n)
        {
            d = n % 10;
            for (int i = 0; i < len; ++i)
            {
                if (i == index) 
                    continue;
                if (num_contains(d, arr[i]))
                    goto next_num;
            }
            ++ordered[index];
        next_num:
            n /= 10;
        }
    }
}

4 个答案:

答案 0 :(得分:3)

goto被视为不良做法。我不知道为什么他也会在continue上说出来。

无论如何 - 改变继续很容易 - 只需反转if

        for (int i = 0; i < len; ++i)
        {
            if (i != index) 
            {
                if (num_contains(d, arr[i]))
                    goto next_num;
            }
        }

或者更加简单:

        for (int i = 0; i < len; ++i)
        {
            if (i != index && num_contains(d, arr[i])) 
                    goto next_num;
        }

现在,摆脱goto。 在这种特定情况下,您使用goto来打破循环并跳过++。所以你可以把它改成:

        int i;
        for (i = 0; i < len; ++i)
        {
            if (i != index && num_contains(d, arr[i])) 
               break;
        }
        if (i == len)
             ++ordered[index];
        ...

注意:我按原样对您的代码执行了此更改。不审查它做了什么或它想做什么。这只是一般的代码优化方法。

修改

为避免同时使用break,您可以使用if中的条件来停止它。 就个人而言,我更喜欢break。它更加清晰,这就是它在语言中的存在。

        int i, stop = 0;
        for (i = 0; i < len && !stop; ++i)
        {
            if (i != index && num_contains(d, arr[i])) 
               stop = 1;
        }
        if (i == len) //Or you can use if(!stop)
           ++ordered[index];

答案 1 :(得分:2)

这是一个只需要对代码进行最小更改的解决方案:

void getrare(int *arr, int *ordered, int len)
{
    for (int index = 0; index < len; ++index)
    {
        int n = arr[index];
        int d = 0;
        while (n)
        {
            d = n % 10;
            int i;      // keep track of loop counter outside the loop
            for (i = 0; i < len; ++i)
            {
                if (i != index && num_contains(d, arr[i]))
                    break;
            }
            // only increment the array if the loop exited before
            // completing (implying the goto would have happened)
            if (i == len)
            {
                ++ordered[index];
            }
            // but always execute this next line of code
            n /= 10;
        }
    }
}

答案 2 :(得分:0)

continue在这种特殊情况下很糟糕,而且goto一般都不好。我刚刚向您展示了以下相关部分:

while (n)
{
    d = n % 10;
    for (int i = 0; 
         i < len && !num_contains(d, arr[i]); 
         ++i);
    if(i == len)
      ++ordered[index];
    n /= 10;
}

我不知道你究竟在做什么,但我也没有改变你的核心逻辑。

答案 3 :(得分:0)

分裂子功能有助于摆脱中断;继续转到循环:

bool does_contain(const int* arr, int len, int d, int ignoredIndex)
{
    for (int i = 0; i < len; ++i) {
        if (i != ignoredIndex && num_contains(d, arr[i])) {
            return true;
        }
    }
    return false;
}

void getrare(const int *arr, int *ordered, int len)
{
    for (int index = 0; index < len; ++index)
    {
        int n = arr[index];

        while (n)
        {
            int d = n % 10;
            if (!does_contain(arr, len, d, index)) {
                ++ordered[index];
            }
            n /= 10;
        }
    }
}