2011-10-08 60 views
0

當amt爲0時程序忽略停止,直到輸入了10個數字。該程序在輸入10個數字後也不會停止。我的錯誤在哪裏?在C中使用while循環的複合條件。

main() { 
int amt; 
int tot = 0; /* running total */ 
int i = 0; /* counts number of times in loop */ 
while (amt!=0 || i < 10) 
    { 
    printf("Enter a number (enter 0 to stop): "); 
    scanf("%d", &amt); 
    tot = tot + amt; 
    i++; 
    } 
printf("The sum of those %d number is %d.\n", i, tot); 

} 
+1

請只是編譯代碼與所有的警告開啓您張貼在這裏了。任何像樣的編譯器都會告訴你像「使用單位化的值'amt'」,並且'main'的原型是不同的。 –

+0

@JensGustedt - 你應該添加這個答案。令人驚訝的是,沒有人甚至認爲編譯器警告可能實際上告訴你代碼有問題。 –

+0

@ D.Shawley,不,不,我不希望SO被重載過度。我只想解決這個問題,這對其他人沒有任何用處。 –

回答

3

您的測試發生在分配amt之前。因此其結果是不確定的。該測試應移至迭代結束時,即do/while。雖然你可以將amt分配給一些非零值,但這對我來說會有點不整潔。

當然你的意思是使用邏輯AND而不是邏輯或?如果兩個amt非零並且i<10,您只想繼續迭代。

當然,如果您確實將測試移動到迭代結束時,那麼您必須考慮到i已在循環內部增加的事實。

1
int amt; 

既然你不初始化。它有一些隨機值,並導致程序中的未定義行爲。
您應始終使用值初始化局部變量。

2

爲了停止後10個號碼或AMT = 0(以先到者爲準滿足),你就必須改變循環條件while (amt!=0 && i < 10)

+0

謝謝。這是正確的答案。該計劃沒有給出任何未定義的行爲 - 它只是沒有適當地遵守條件。 – jrasa

+2

@jrasa該程序確實有未定義的行爲。這很簡單。這個答案肯定不是完整的故事。如果第一次進行測試時'amt'恰好爲零,那麼一旦您改變使用'&&',您將不再進入循環。在你的程序版本中,未定義的行爲是良性的,因爲從我<10持有以來第一次測試總是評估爲真。 –

+1

@jrasa我完全同意上面的評論 - 條件不是唯一的問題,儘管對於您的輸入數據很重要。如果您只是改變條件,其他提到的因素可能會導致意想不到的結果。 – Lyth