我在使用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 );
}
}
答案 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 ) )