【问题标题】:Are logical OR and comma operators equivalent?逻辑 OR 和逗号运算符是否等效?
【发布时间】:2014-01-04 12:56:16
【问题描述】:

今天我发现了一个我以前从未见过的语法。 ||, 是一样的吗?

bool f() {

    cout << "f";
    return true;
}

bool g() {

    cout << "g";
    return true;
}

int main() {


    if(f(),g())
    {
        cout<<"OK with ,";
    }

    cout<<endl;

    if(f()||g())
    {

        cout<<"OK with ||";
    }

    return 0;
}

从这个程序的输出来看,是这样的:

fgOK with ,
fOK with ||

它们是完全相同的东西还是有什么细微的差别?

【问题讨论】:

  • 不,他们是不同的运营商。事实上,根据标准,您的输出是错误的。
  • 这有点像问 + 和 * 是否相同,因为 2+2 和 2*2 给出相同的结果。
  • -1,您的代码不会重现您所谓的输出(除非您的编译器严重损坏)。不,它们不一样。
  • @OliCharlesworth 除了结果不一样。最初,它使用&amp;&amp; 而不是||,所以结果应该是一样的。所以更像是问+*是否相同,因为3+33*3给出相同的结果:)

标签: c++ operators comma-operator


【解决方案1】:

f(),g() 表示评估f() 然后评估g() 并返回g(),因为您的g() 返回true 这是返回给if 的内容

所以,不,运营商完全不同。

如果您修改函数以从 g() 返回 false,您可以看到差异。条件f()||g() 仍将评估为true,而f(),g() 将返回false

【讨论】:

    【解决方案2】:

    这个(逗号操作符)

    if(f(),g())
    

    将计算f()g() 并返回第二个操作数g() 的值

    逻辑或运算符

    if(f()||g())
    

    如果f() 评估为真,则不会评估g()。这被称为short-circuit evaluation - 如果 f() 返回 true,则逻辑 OR 条件已经满足 - 因此评估 g() 没有意义。

    因此它们完全一样,即使在某些条件下您可能会看到相同的整体行为。

    【讨论】:

      【解决方案3】:
      • || 是逻辑 OR 运算符,按照标准,它遵循 short-circuit evaluation(即,如果第一个操作数已经足以确定整个逻辑表达式,它将不会计算第二个操作数)

      • , 是逗号运算符,它计算两者,但只返回第二个操作数的值。

      顺便说一下,你应该看到类似的东西:

      fgOK with ,
      fOK with ||
      

      您没有看到它的原因可能是因为您使用的编译器没有严格遵循标准(我怀疑是 MSVC..)

      http://ideone.com/8dSFiY

      【讨论】:

        【解决方案4】:

        它们是完全不同的运算符,用于完全不同的目的。

        主要区别在于:

        • , 运算符(除非重载)将评估其所有参数并返回最后一个参数,无论如何。
        • || 运算符将计算所有参数,直到达到第一个 trueish 值,并且不会计算其余参数。

        这也是为什么输出,你声称收到,is wrong

        【讨论】:

          猜你喜欢
          • 2012-06-18
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2020-03-09
          • 1970-01-01
          • 2012-10-01
          • 1970-01-01
          相关资源
          最近更新 更多