提取包含continue语句的函数

时间:2015-10-17 17:12:12

标签: function loops break continue

这只是我很好奇的事情 考虑一下这段代码:

int i;

int main()
{
    while (i < 100) {

        // skip 10 numbers if current number is prime
        if (is_prime(i)) {
            i += 10;
            continue;
        }

        printf("%d ", i);
        i++;
    }
}

想象一下if部分更长,我想提取新功能以便于阅读。
我很想做这样的事情:

int i;

void skip_ten_if_prime();

int main()
{
    while (i < 100)  {
        skip_ten_if_prime();
        printf("%d ", i);
        i++;
    }
}

void skip_ten_if_prime() {
    if (is_prime(i)) {
        i += 10;
        continue;
    }
}
但是,这不会起作用,因为显然continue语句现在不在循环中(并且无法知道 继续,可以这么说) 。实际上同样适用于break

以下是我想知道的事情:

  • 我的前提是否存在缺陷?换句话说,想要在这样的循环中提取函数是错误的吗?
  • 如果没有,这样做的最佳方法是什么?我可以想到几种方法,但我不确定应该采用哪种方式任何。
    我可以引入一个像do_continue这样的全局变量,它在函数中设置并在循环内部检查(如果这是面向对象的,则是成员变量),但这对我来说似乎是不好的做法。
    另一种方法是让函数返回一个布尔值并检查循环内部。这会产生类似if (skip_ten_if_prime()) continue;的内容,而且我不确定这是否可取,因为函数永远不会返回任何内容,并且函数名称如handle_foo()(或{ {1}})检查的内容可能并不明显。
对于像这样的简单问题,我倾向于做太多的阐述,如果我在任何地方都不清楚,那么道歉。

1 个答案:

答案 0 :(得分:0)

您的函数skip_ten_if_prime可以返回bool值。如果i是素数则为真,而在另一种情况下为假。然后通过返回值,您可以决定是否需要执行continue语句。

另外,为此目的创建全局变量并不是一个好主意。请考虑将i变量的引用或指针传递给skip_ten_if_prime函数。

以下是如何解决问题的示例。     int i;

bool skip_ten_if_prime();

int main()
{
    while (i < 100)  {
        if(skip_ten_if_prime()) {
           continue;
        }
        printf("%d ", i);
        i++;
    }
}

bool skip_ten_if_prime() {
    if (is_prime(i)) {
        i += 10;
        return true;
    }
    return false;
}