2017-06-22 25 views
1

我剛開始嘗試學習C編程,並且我非常想知道它是如何工作的。在循環內部賦值的變量不起作用。爲什麼?

我想寫一個程序來計算我按下ENTER,SPACE和TAB的次數。下面的代碼工作:

while((text = getchar()) != EOF){ 

    if(text == '\n') 
     ++newlines; 

    if(text == ' ') 
     ++blanks; 

    if(text == '\t') 
     ++tabs; 
} 

但是,下面的代碼無法正常工作:

text = getchar(); 

while(text != EOF){ 

    if(text == '\n') 
     ++newlines; 

    if(text == ' ') 
     ++blanks; 

    if(text == '\t') 
     ++tabs; 
} 

我想知道爲什麼它工作時,我分配循環內的變量,而不是外面。

如果我將它指定到循環外並在控制檯中運行程序,程序會在我按下ENTER後停止。

+0

在第二個文本永遠不會改變或重新讀取,所以你得到一個無限循環。 PS - 從不調用char變量「text」。 「文本」聽起來像一個字符串變量或類似的。 – ebyrob

+0

你不要在上面的代碼中聲明ANYWHERE的任何變量。你所做的就是給變量賦值。第一個和第二個示例的區別在於,第一個示例中的「getchar」位於循環內部。第二個在外面。在第二個例子中,如果您只讀取一個字符,然後一遍又一遍地循環該字符,會發生什麼?它永遠不會是EOF,因此將永遠運行。 –

+0

感謝您的澄清,Sani!我編輯過它。 – Akitirija

回答

3

在第一種情況下,每次運行循環時都會得到一個新字符。每次到達循環結束時,循環都會重新檢查該條件。在第二種情況下,您仍然每次都在檢查,但價值並未發生變化 - 這與您剛開始時的價值相同。所以如果第一個字符不是EOF ......那麼......你無限循環!

你可以通過再次迭代之前reupdating text解決第二種情況:

text = getchar(); 

while(text != EOF){ 

    if(text == '\n') 
     ++newlines; 

    if(text == ' ') 
     ++blanks; 

    if(text == '\t') 
     ++tabs; 

    text = getchar(); //added 
} 
+1

我試圖想出一個很好的解釋,其中包括條件「副作用」以及您在此解釋的無增量迭代。但是......這很複雜。當'while(x ||(y = 1)== x)'出現時會發生什麼,以及我們如何傳達良好的風格通常會最小化「副作用編碼」。 (即:不要從複製有問題的代碼學習壞習慣) – ebyrob

+0

我認爲這只是歸結爲解釋在編程中有一席之地。 while循環內的條件不是分配的地方,總是有一種更可讀和更安全的方式來實現相同的結果。千萬不要試圖用「編碼高爾夫球」來解決問題,因爲它使用較少的文字。 –

+0

我必須承認T運營商的某種嗜好,因爲害怕腐蝕某人,所以我不會在這裏完全命名。我可能會認爲我的使用是好的,但可能沒有可接受的用途。就像在循環或分支中跳過花括號一樣糟糕。 PS - 你不能非常喜歡AJAX。 – ebyrob

相關問題