2013-06-23 93 views
2

爲什麼布爾型&&在這種情況下工作?當我輸入「黃色」不應該「短路」,而不檢查第二個條件,因爲第一個條件「紅色」是錯誤的?爲什麼我在工作的時候不應該這樣做?

#include <iostream> 
#include <string>     
using namespace std; 

int main() 
{ 
    string color; 
    do 
    { 
     cout << "Pick one of the colors: red, yellow, or blue\n"; 
     cin >> color; 
    }while ((color != "red") && (color != "yellow") && (color != "blue")); 

    { 
     cout << "I like that color too"; 
     return 0; 
    } 
} 

   

+0

爲什麼你會使用第二對括號呢?這是問題的一部分? – Emadpres

+0

您只需在整個條件之前使用一個小「!」來糾正它。 – Emadpres

+1

'_因爲第一個條件「紅色」是假的?_'實際上不是。這可能是整個混亂的根源。 – ComicSansMS

回答

1

color"yellow",然後(color != "red")是真的。所以它檢查下一個條件,(color != "yellow"),這是錯誤的。所以這個條件是錯誤的。第三個測試(color != "blue")不被執行,因爲表達式已經被評估爲假,因此其評估被短路。

(color != "red")   // color == "yellow", so this is true 
&& (color != "yellow")  // color == "yellow", so this is false 
&& (color != "blue") 
+0

謝謝,我不知道爲什麼我有這個簡單的概念有問題。 –

+0

非常歡迎。 – jxh

0

在如果第一單條件評估爲false結果&&情況下事件將整個條件進行評估,以false

嘗試這種解決方案

while ((color != "red") || (color != "yellow") ||(color != "blue")); 
+0

看起來,提問者首先想要這個代碼,但它不是他要求的答案;) – 0xc0de

0

其實困惑就在於你的病情的理解:

color != "red" 

當你鍵入黃色它實際上是作爲真實的顏色不紅,但是它短路在這裏:

color != "yellow" 

因爲條件是錯誤的,並且因爲o對&&必須都是真的短路。

+0

實際上,它只能在用戶退出循環時纔會打印,即。只有當他/她選擇紅色或黃色或藍色。 – 0xc0de

0

這裏是另一種方式來看待代碼:

怎麼看的話,而直至相反,我們可以重寫做,而(X)作爲一個做,直到;(X!)循環,遍歷循環,直到條件(!x)爲真。

代直到(!X)的同時(X),我們得到

#include <iostream> 
#define until(!(x)) while(x) 

int main() 
{ 
    string color; 
    do 
    { 
     cout << "Pick one of the colors: red, yellow, or blue\n"; 
     cin >> color; 
    } 
    until (!((color != "red") && (color != "yellow") && (color != "blue"))); 

    cout << "I like that color too"; 
    return 0; 

} 

使用德摩根定理,其中指出!((!X [0])& &(!X [1]) & & ... & &(!x [n]))== x [0] || x [1] || ... || X [N],我們可以因爲當條件爲真,當你輸入「黃色」手術室只有短路,第一個條件變爲假,第二個條件爲真改造,直到語句轉換成

until(color == "red" || color == "yellow" || color == "blue");  

。這會導致一個短路,然後打開while()循環並打印出「我也喜歡那種顏色」!

+0

語法應該是'repeat {} until()'。 – 0decimal0

+0

我沒有使用正式的編程約定。我只是簡單地使用臨時替代來澄清問題。 – jcccj1

+0

那麼把它放在代碼塊(和main()代碼中)會混淆... – 0xc0de

相關問題