這只是我很好奇的一件事。
考慮這段代碼:提取包含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()
(或handle_bar()
)之類的函數名稱,可能不明顯是什麼被檢查。
我傾向於對這樣的簡單問題做太多的闡述,所以如果我在任何地方都不清楚,請道歉。
IMO ...使用另一個函數檢查布爾結果從第一個將是從上述兩個更好的方法。 –