【问题标题】:Extracting a function that contains a continue statement提取包含 continue 语句的函数
【发布时间】:2015-10-17 17:12:11
【问题描述】:

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

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()(或handle_bar())这样的函数名称可能并不明显什么是正在检查中。

对于像这样简单的问题,我倾向于做太多的阐述,所以如果我在任何地方不清楚,请道歉。

【问题讨论】:

  • IMO ...利用另一个函数检查第一个布尔结果将是上述两个更好的方法。

标签: function loops break continue


【解决方案1】:

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

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

这是一个如何解决您的问题的示例。 诠释我;

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;
}

【讨论】:

  • 好吧,我发布的代码实际上只是一个示例。尽管我建议的两种方法中后者是可取的,但我正在放弃这一点,并且可能没有更好的方法,所以谢谢你。
猜你喜欢
  • 2012-09-10
  • 2011-10-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多