2015-10-17 91 views
0

這只是我很好奇的一件事。
考慮這段代碼:提取包含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())之類的函數名稱,可能不明顯是什麼被檢查。

我傾向於對這樣的簡單問題做太多的闡述,所以如果我在任何地方都不清楚,請道歉。

+0

IMO ...使用另一個函數檢查布爾結果從第一個將是從上述兩個更好的方法。 –

回答

0

您的功能skip_ten_if_prime可以返回布爾值。如果i是素數,則爲真,在另一種情況下爲false。然後通過返回值,您可以決定是否需要執行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; 
} 
+0

好吧,我發佈的代碼實際上只是一個例子。儘管這兩種方法我認爲後者是可取的,並且可能沒有更好的方法,所以非常感謝。 – vvye