2012-12-02 182 views
0

我在使用C++中的邏輯OR運算符時遇到了問題。問題在於如果左側爲真,右側表達式不會被評估。我有兩個deque-s,我需要從他們那裏彈出一段時間,但是如果我可以從第一個deque彈出,我不會從第二個彈出,因爲沒有通過OR運算符進行評估。我怎樣才能克服這個問題。下面是一段代碼:邏輯或表達式C++

while(D.popLeft(k) || E.popLeft(m)) 
{ 
    if(k < m) 
    { 
     C.pushRight(k); 
     E.pushLeft(m); 
    } 
    else 
    { 
     C.pushRight(m); 
     D.pushLeft(k); 
    } 
} 
+1

使用'&&'而不是? –

+0

爲什麼不使用&&代替? – noko

+4

這不是一個「問題」;這是一個功能。 –

回答

0

使用&&操作

while(D.popLeft(k) && E.popLeft(m)) 
1

我想你只需要運行循環的內容時,您可以填寫m和K,對不對?然後簡單地用一個AND替換你的OR:

while(D.popLeft(k) && E.popLeft(m)) 
{ 
    if(k < m) 
    { 
     C.pushRight(k); 
     E.pushLeft(m); 
    } 
    else 
    { 
     C.pushRight(m); 
     D.pushLeft(k); 
    } 
} 

然後兩個彈出都會被執行。

+0

是的,對我來說太愚蠢了,這很簡單!謝謝你們,對於這個愚蠢的問題感到抱歉:-D – shadow320

+1

如果它適合你,你可以考慮接受一個正確的答案作爲解決方案(通過按刻度線)。這樣,後來偶然發現這個問題的人清楚地指出瞭解決這個問題的好方法。 – Joost

1

假設你要保持你的||(而不是使用&&),你可以separatly評價:

bool canPopE = E.popLeft(m); 
bool canPopD = D.popLeft(k); 
bool canPop = canPopD || canPopE; 

while(canPop) 
{ 
    if(k < m) 
    { 
     C.pushRight(k); 
     E.pushLeft(m); 
    } 
    else 
    { 
     C.pushRight(m); 
     D.pushLeft(k); 
    } 

    canPopE = E.popLeft(m); 
    canPopD = D.popLeft(k); 
    canPop = canPopD || canPopE; 
} 
+0

雖然這確實保持了OR條件,但它爲沒有新鮮彈出的k和m調用更令人不安的問題奠定了基礎。嚴格地說,你是正確的,這是維護邏輯的一種體面的方式,但我相當有信心提問者意圖與衆不同。但是,我們不能肯定地說,因爲OP的意圖不完全清楚。 – Joost

+0

@Joost我完全同意,只是提出了一個直接解決問題的問題(即彈出雙方)。 –

0

默認爲C++邏輯運算符使用短路機制,如果你想要做你的循環沒有短電路,使用急切的操作符「|」代替。這將以任何方式評估這兩個表達式。 http://en.wikipedia.org/wiki/Short-circuit_evaluation

while(D.popLeft(k) | E.popLeft(m)) 
+0

這個雖然我用於合併兩個排序的Deques在一個排序的Deque中。但我試圖做到這一點很困難。對不起,我的英語不好。 – shadow320

+0

那麼,你能否請求改變你的問題以表達你想說的話? –