【问题标题】:logical or expression c++逻辑或表达式 C++
【发布时间】:2012-12-02 11:02:38
【问题描述】:

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

【问题讨论】:

  • 这不是“问题”;这是一个功能。
  • 你能详细解释一下吗?
  • @KirilKirov:这肯定会破坏循环条件,尽管目前还不完全清楚那个条件是什么

标签: c++ operators expression


【解决方案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都会被执行。

【讨论】:

  • 是的,我太笨了,很简单!谢谢大家,抱歉这个愚蠢的问题:-D
  • 如果它适合您,您可以考虑接受正确答案之一作为解决方案(通过按勾号)。这样一来,后来偶然发现这个问题的人就会清楚地知道什么是解决问题的好方法。
【解决方案2】:

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

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

【讨论】:

  • 虽然这确实维持了 OR 条件,但它为更令人不安的问题奠定了基础,即调用 k 和 m 而不是新弹出的。严格来说你是对的,这是保持逻辑的一种不错的方式,但我相当有信心提问者的意图是不同的。不过,不能肯定地说,因为 OP 的意图并不完全清楚。
  • @Joost 我完全同意,只是为所提出的问题提供了一个直接的解决方案(即弹出双方)。
【解决方案3】:

使用&amp;&amp; 运算符

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

【讨论】:

    【解决方案4】:

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

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

    【讨论】:

    • 我使用的这个是用于将两个排序的 Deque 合并到一个排序的 Deque 中。但我很难做到这一点。对不起我的英语不好。
    • 那么,您能否更改您的问题以显示您想说的内容?
    猜你喜欢
    • 1970-01-01
    • 2015-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-01-18
    • 1970-01-01
    相关资源
    最近更新 更多