逻辑或表达式c ++

时间:2012-12-02 11:02:39

标签: c++ operators expression

我在使用C ++中的Logical OR运算符时遇到问题。问题是,如果左侧为真,则不评估右侧表达式。我有两个deque-s,我需要一段时间从它们popLeft,但如果我可以从第一个deque弹出,我不会从第二个弹出,因为没有被OR运算符评估。我怎样才能克服这个问题。这是一段代码:

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

4 个答案:

答案 0 :(得分: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 );
    }
}

然后两个弹出都将被执行。

答案 1 :(得分:1)

假设您要保留||(而不使用&&),您可以分开评估:

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;
}

答案 2 :(得分:0)

使用&&运算符

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

答案 3 :(得分:0)

默认情况下,C ++逻辑运算符使用短路机制,如果你想在没有短路的情况下进行循环,请使用急切的运算符“|”代替。这将以任何方式评估两个表达式。 http://en.wikipedia.org/wiki/Short-circuit_evaluation

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