【发布时间】: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