代码之家  ›  专栏  ›  技术社区  ›  djeidot

我可以使用&=阻止函数执行吗?

  •  1
  • djeidot  · 技术社区  · 14 年前

    示例代码如下:

    bool result;
    result = Operation1();
    result &= Operation2();
    result &= Operation3();
    return result;
    

    其目的是确保,如果任何函数返回false,则不会调用后面的函数。这个语法正确吗?还是我需要这样做? result = result && Operation2(); ?

    5 回复  |  直到 14 年前
        1
  •  7
  •   Fred Larson    14 年前

    如果您的意思是逻辑的“and”而不是按位(我想是的,因为您使用的是 bool )使用短路:

    result = Operation1() && Operation2() && Operation3();
    

    函数将从左到右进行计算,直到其中一个函数返回 false ,则不会对其余部分进行评估。

        2
  •  2
  •   Fred Nurk    14 年前

    代码的短路版本(不需要立即返回结果变量):

    if (!Operation1()) return false;
    if (!Operation2()) return false;
    return Operation3();
    

    或者,如果表达式确实与此示例中的表达式一样短:

    return Operation1() && Operation2() && Operation3();
    

    如果示例代码不具有代表性,并且由于某些未说明的原因需要变量:

    bool result = Operation1();
    if (result) result = Operation2();
    if (result) result = Operation3();
    return result;
    
        3
  •  1
  •   wkl    14 年前

    & 执行按位“and”,因此实际上您正在尝试 and 所有答案都在一起(如果三个操作都成功,则为真,否则为假)。在以下情况下,这不提供短路评估: Operation2() 不被称为 Operation1() 失败,以及在哪里 Operation3() 不被称为 操作2() 失败.

        4
  •  1
  •   Edward Strange    14 年前

    你的方法的问题是我不相信 true 必须始终以相同的值结束。例如,如果一个操作返回2,另一个操作返回4,而您和这些操作一起得到0,或者 false . 即使他们都回来了 我不知道在标准中有任何特定的保证,即它们将具有相同的位模式。实际上,他们可能会…但是…?

    所以我会坚持 && 运算符,除非使用积分并确保opx()始终返回一个特定的值(对于true)和另一个值(对于false),以便 &= 接线员保证按你所期望的去做。

    此外,还有 & 你不会短路的。

        5
  •  1
  •   Jon    14 年前

    我通常认为这个模式写的是:

    bool result = true;
    result = result && Operation1();
    result = result && Operation2();
    result = result && Operation3();
    return result;