自逻辑和

Self logical and?

本文关键字:逻辑和      更新时间:2023-10-16

答案对你们中的一些人来说可能是显而易见的,但由于我找不到答案,我需要问它。通常,如果一个函数必须返回所有是否都执行了没有问题,我会使用一个布尔值来跟踪任何故障。

bool myFunction()
{
    bool ok = true;
    if (...) {
        if (...) {
            ok = ...;
        }
        ok = ok && (...);
    }
    ok = ok && (...);
    return ok;
}

由于不存在&&=,我经常使用这种语法:ok = ok && (...)(...)可以是条件或值)。但我觉得这很不优雅。有没有C++符合标准的方法可以更简洁、更优雅地编写它?

您可以将&=与布尔标志一起使用:

bool myFunction()
{
    bool ok = true;
    if (...) {
        if (...) {
            ok &= ...;
        }
        ok &= ...;
    }
    ok &= ...;
    return ok;
}

只需提前返回,因为如果ok变得false,则不会执行其他代码:

bool myFunction()
{
    bool ok = true;
    if (...) {
        if (...) {
            if (!...) return false;
        }
        if (!...) return false;
    }
    return (...);
}

这是异常优于错误代码的另一个原因:如果不处理它们,则不会对正常代码路径进行意大利面条化代码。

尝试使用:

&=

而不是 &&=

您可以使用相等&=运算符,因为 bool 是 1 位类型,并且所有算术运算符都有效。

或者,

您可以选择不使用返回值。

传入用于成功或失败的对象或函数指针。

例如,带有对象:

void onConditionOtherwise(BooleanAction& action)
{
    if (...) && (...) {
        action.success();
    } else {
        action.failure();
    }
}

执行此操作的最标准方法是在条件不满足时返回 false,否则在方法结束时返回 true。所以实际上你甚至不需要那个布尔变量。
就这样用吧:

bool myFunction()
{
    if (...) {
    } else return false;
    return true;
}

如果您坚持使用布尔值,请使用 &= 运算符。