0

C++で論理OR演算子を使用する際に問題が発生しました。問題は、左側が真の場合、右側の式が評価されないということです。2つの両端キューがあり、しばらくしてそれらからpopLeftする必要がありますが、最初の両端キューからポップできる場合は、OR演算子によって評価されないため、2番目の両端キューからポップしません。どうすればこの問題を克服できますか。コードは次のとおりです。

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 の両方を満たすことができる場合にのみ、ループの内容を実行したいと思いますよね? 次に、OR を AND に置き換えるだけです。

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 に答える