2012-12-02 75 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

那么,你能否请求改变你的问题以表达你想说的话? –