Самостоятельно логично и?

Для некоторых из вас ответ может быть очевиден, но, поскольку я не могу найти ответа, мне нужно его спросить. Часто, если функция должна возвращать, все ли было выполнено без проблем, я использую логическое значение, отслеживающее любой сбой.

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

Поскольку &&= не существует, я часто использую этот синтаксис: ok = ok && (...) ((...) может быть условием или значением). Но я считаю это весьма нелегким. Есть ли способ сделать это более лаконично и элегантно, совместимый со стандартом C ++?


person Vincent    schedule 10.10.2012    source источник
comment
Ответы на этот вопрос объясняют, почему безопасно использовать &=.   -  person jogojapan    schedule 10.10.2012


Ответы (6)


Вы можете просто использовать &= с логическим флагом:

bool myFunction()
{
    bool ok = true;
    if (...) {
        if (...) {
            ok &= ...;
        }
        ok &= ...;
    }
    ok &= ...;
    return ok;
}
person nneonneo    schedule 10.10.2012

Просто вернитесь раньше, так как никакой дополнительный код не выполняется, если ok становится false:

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

    return (...);
}

Это еще одна причина, по которой исключения лучше, чем коды ошибок: если вы не обрабатываете их, вы не спагетифицируете код для нормальных путей кода.

person GManNickG    schedule 10.10.2012

Вы можете использовать оператор &=, который равен, потому что bool - это 1-битный тип, и все арифметические операторы работают.

person Denis Ermolin    schedule 10.10.2012

попробуйте использовать:

&=

вместо && =

person Euclides Mulémbwè    schedule 10.10.2012

В качестве альтернативы вы можете отказаться от использования возвращаемых значений.

Передайте указатели на объекты или функции для использования в случае успеха или неудачи.

Например. с объектом:

void onConditionOtherwise(BooleanAction& action)
{
    if (...) && (...) {
        action.success();
    } else {
        action.failure();
    }
}
person Peter Wood    schedule 10.10.2012

Самый стандартный способ сделать это - вернуть false, если ваше условие не выполняется, в противном случае вернуть true в конце метода. Так что на самом деле вам даже не нужна эта логическая переменная.
Просто используйте ее так:

bool myFunction()
{
    if (...) {

    } else return false;

    return true;
}

Если вы настаиваете на использовании логического значения, используйте оператор & =.

person akrabi    schedule 10.10.2012