2012-10-10 2 views
0

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

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

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

+0

Ответы на [этот вопрос] (http://stackoverflow.com/questions/2488406/why-doesnt-c-have-or-for-booleans) объяснить, почему это безопасно используйте '& ='. – jogojapan

ответ

2

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

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

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

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

    return (...); 
} 

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

1

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

1

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

&= 

вместо & & =

0

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

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

    } else return false; 

    return true; 
} 

Если вы настаиваете на использовании булевой использовать & оператор =.

0

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

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

E.g. с объектом:

void onConditionOtherwise(BooleanAction& action) 
{ 
    if (...) && (...) { 
     action.success(); 
    } else { 
     action.failure(); 
    } 
} 
Смежные вопросы