2017-10-17 34 views
3

我目前正在德國學習計算機科學,但在做過幾個C/C++開源項目之前。 今天我們開始在學校用C,我的老師說這將是一個沒有去修改循環內的循環變量,我絕對同意。但是,我經常使用一個沒有最後一個增量部分的for循環,然後在循環內部修改它只有,這也是他不喜歡的。爲沒有增量vs

所以基本上可以歸結爲

for(int i=0; i<100;) { 
    [conditionally modify i] 
} 

VS

int i=0; 
while(i<100) { 
    [conditionally modify i] 
} 

我知道,他們基本上是編譯後是相同的,但我不喜歡使用while循環,因爲:

  1. 通常的做法是將變量限制在最小範圍內
  2. 它可以引入錯誤,如果你再用我(你有因爲到更大的範圍)
  3. 你不能在以後的循環使用不同類型的,因爲我沒有使用不同的名稱

是否有任何風格指南/常見做法哪一個可供選擇?

如果您回答「我喜歡while/for more」,至少爲您提供了一個原因。

我已經搜索過類似的問題,但是我找不到任何真實的答案。

+1

沒有「硬規則」對你使用一個for循環的。如果你需要它,使用它。但是,檢查是否有一些標準庫方法的算法可以首先解決底層問題。 (從C++迭代循環POV大多說到此處,標籤是自除去。) –

+1

SMH我不; t等'[有條件地修改I]'一部分。如果情況從未得到滿足呢? –

+0

*「我的老師說,在循環內部修改for循環變量是不行的,我完全同意這個觀點。」*:你問老師他爲什麼這麼想?你爲什麼同意他? – haccks

回答

2

風格指南因不同的人員/團隊而異。

C標準描述的for的語法如下:

for(子句-1;表達-2;表達-3)語句

它是c ommon的做法是使用for只要你有「條款-1」的有效利用,並且做這樣的原因是確實由於範圍有限:

[...如果子句-1是 聲明,它聲明任何標識符的範圍是聲明的其餘部分和 整個循環,包括另外兩個表達式; [...]

所以,你的論證是好的,你可以嘗試說服你的老師。但不要太努力。畢竟,作風問題,很少有一個明確的答案,如果你的老師對他的規則堅持,只要按照他們的編碼該類時。

+0

我會補充一點,如果你爲了生活而編寫代碼,你可能會在樣式指南下工作,這些指南指定不同的方法來編寫像這樣的循環。 –

0
for(int i=0; i<100;) { 
[conditionally modify i] 
} 

因爲這看起來混亂,不規範的方式來寫循環。此外,有條件地修改我是危險的,你不想這樣做。有人閱讀你的代碼會遇到問題,理解你如何增加,爲什麼,當..等等。你想保持你的代碼乾淨和容易理解。

我個人從不寫有條件修改迭代器的循環。如果你需要它,你可以使用額外的計數器,或類似的東西。但是你不應該通過條件迭代器來控制流,有些人甚至可以避免中斷並繼續。

+2

我不會downvote,但我不同意。雖然條件修改有點難看,但這並不危險。而且在某些情況下,這是必要的或至少比替代方案更具可讀性。 – user694733

+0

也許有時候,但他一般問這個問題,對吧?想象一下,閱讀某人的代碼和每一個循環都需要推導出它的增量。我只是不喜歡用迭代器來控制循環流,我認爲有更好的方法來做到這一點。 – Mare70

+0

我同意你的解釋,但它是「while」循環的一個參數,而不是「for」循環。 – chqrlie

0

程序員在決定使用哪個循環時遵循一些常見做法 - forwhile

for循環似乎是最適當的時候迭代次數是事先知道的。例如 -

/*N - size of array*/ 
for (i = 0; i < N; i++) { 
  ... 
} 

但是,可能有許多複雜的問題,其中取決於特定條件的迭代次數,並且不能預先預測,while循環是在這些情況下是優選的。 例如 -

while(fgets(buf, MAXBUF, stdin) != NULL) 

然而,無論forwhile環路項控制環和可以互換。它完全由程序員決定使用哪一個。

0

如果您正在修改體內循環計數器,我建議不要使用for循環,因爲它比while循環更容易引起讀者的困惑。

您可以解決缺乏範圍限制與附加塊:

{ 
    int i = 0; 
    while (i < 100) { 
     [conditionally modify i] 
    } 
}