Переназначение логического значения, если не верно - PullRequest
0 голосов
/ 14 марта 2011

У меня есть метод foo () и foobar (), которые оба возвращают логическое значение.Каждый из них должен выполняться независимо от результата.

boolean changed = true;
while(changed) {
    changed = foo();
    if(!changed) {
        changed = foobar();
    }
    else {
        foobar();
    }
}

Я хочу, чтобы цикл продолжал выполняться до тех пор, пока изменено значение true, но я чувствую себя вторым блоком кода из ifs и elses для foobar () не очень ... элегантно.Есть ли лучший способ записать эту часть, чтобы измененная переменная была переназначена, только если она еще не верна?

Спасибо!

Ответы [ 6 ]

3 голосов
/ 14 марта 2011

Я хочу, чтобы цикл продолжал выполняться до тех пор, пока измененное значение истинно
означает?Вы хотите остановить цикл, если оба метода возвращают false, если да, тогда выполните:

boolean changed = true;
boolean changed1 = true;

    while(changed || changed1) {
        changed = foo();
        changed1 = foobar();
    }
3 голосов
/ 14 марта 2011

Как насчет:

changed = foo() | foobar();

Обратите внимание на использование побитового или оператора.

1 голос
/ 14 марта 2011

Помимо опции побитового ИЛИ, вы также можете просто указать changed секунду в выражении, и все методы будут выполнены:

changed = foo();
changed = bar() || changed;
changed = baz() || changed;

Мне больше нравится побитовая опция, так как она связываетсячто методы имеют необходимые побочные эффекты.Вышесказанное должно быть хорошо задокументировано, чтобы кто-то не смог прийти позже и «исправить его, чтобы он был более производительным».

0 голосов
/ 15 марта 2011

хороший пример использования do-while:

boolean changed;    // no initial value needed
do {
    changed = foo() | foobar();  // should not be ||
} while(changed);
0 голосов
/ 14 марта 2011

По сути, вы хотите, чтобы один из методов foo () или foobar () возвращал true, чтобы продолжить выполнение цикла.

boolean time_to_stop = false;
while (!time_to_stop) {
    boolean foo_result = foo();
    boolean foobar_result = foobar();
    if (false == (foo_result || foobar_result) ) {
        time_to_stop = true;
    }
}

Вы можете сократить это, используя синтаксически эквивалентные структуры кода:

boolean keep_going = true;
while (keep_going) {
    keep_going = foo() | foobar(); 
    // bit-wise OR, avoids compiler short-circuiting optimization
}

Конечная комбинация:

while ( foo() | foobar() ) {};
0 голосов
/ 14 марта 2011

Вы можете использовать ниже сокращенный код styntax

boolean changed = true;
while(changed) {
    changed = (foo())?foobar():(true|foobar());
}

Я отредактировал ответ. Спасибо всем за указание на ошибку:)

...