0

我在 C++ 中使用逻辑 OR 运算符时遇到问题。问题来了,如果左侧为真,则不计算右侧表达式。我有两个双端队列,我需要在一段时间内从它们中弹出左端,但是如果我可以从第一个双端队列弹出,我不会从第二个双端队列弹出,因为 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

4 回答 4

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

然后两个 pop 都会被执行。

于 2012-12-02T11:06:07.453 回答
1

假设您想保留您的||(而不是使用 a &&),您可以单独评估:

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;
}
于 2012-12-02T11:08:49.453 回答
0

使用&&运算符

while( D.popLeft( k ) && E.popLeft( m ) )
于 2012-12-02T11:04:47.770 回答
0

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

while( D.popLeft( k ) | E.popLeft( m ) )
于 2012-12-02T11:14:46.610 回答