2011-03-09 183 views
1

我有一個關於while循環的快速問題。C - 雖然(東西||東西)

我想讀取ASCII字符碼,如果它不是一些特定的ASCII碼,我不想繼續並要求用戶再次輸入。

這工作

while (yn != 89) 
    { 
     printf("\nEnter"); 
     flushall(); 
     scanf("\n%c", &yn); 
    } 

這不

while (yn != 89 || yn != 121) 
    { 
     printf("\nEnter"); 
     flushall(); 
     scanf("\n%c", &yn); 
    } 

天哪,我想我需要得到一些睡眠。這相當...愚蠢。 :)謝謝你傢伙順便說一句。

+5

''||手段「或」'!='表示「不等於」。大聲讀出代碼給自己,我想你可能會看到問題。 – 2011-03-09 20:30:18

+0

那就是生活,接受一個答案並繼續前進:) – Johan 2011-03-09 20:48:38

回答

8

表達式yn != 89 || yn != 12總是如此。任何值不等於89或不等於12。所以,這種表達方式沒有實際意義。循環將永遠循環,因爲重複條件總是如此。

根據您的描述,您需要的條件是yn != 89 && yn != 12&&,而不是||

3

你的布爾邏輯是有點過:

while (yn != 89 && yn != 121) 

另一種方式來寫這個,其可以是作爲一個「閱讀器」多個邏輯:

while (!(yn == 89 || yn == 121)) 
1

yn是89它是不是121;同樣當yn是121時,它是而不是89;因此,條件總是滿足。

也許你的意思,而yn不是非此即彼89121,這是措辭與

while(yn != 89 && yn != 121) 

或者你也可以說 「當yn既不是89121」:

while(!(yn == 89 || yn == 121)) 
3

替換||與& &。

原因是:

!(yn == 89 || yn == 121) < ==>yn != 89 && yn != 121(的DeMorgan)

0

(A || B)倒數是(!A && !B)(A && B)逆是(!A || !B)。你在構建原始循環時的思維過程是這樣的:「我想yn == 89,所以我應該反轉即循環yn != 89。」然後你決定改變它,「我想yn == 89 || yn == 121,所以我需要反轉。」那就是你出錯的地方:從我最初提交的表格中,你可以看到倒數(用作你的while條件)是yn != 89 && yn != 121。您只是簡單地將||的原始簡單反轉擴展。

1

要擴大一點在其他答覆 - 你永遠不會達到你的第二個條件。第一個 「短路」

if (yn != 89

和立即停止。如果它不是89,我們就完成了。因爲||(OR)是「如果其中任何一種情況」,我們不關心if之後的任何內容。當然,如果是89 ...那麼它肯定不是121

你想while (yn != 89 && yn != 121)