0

我有一个方法 foo() 和 foobar() 都返回一个布尔值。无论结果如何,它们中的每一个都必须执行。

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

我希望循环继续执行,只要更改为真,但我觉得 foobar() 的 ifs 和 elses 的第二个代码块不是很......优雅。是否有更好的方法来编写该部分,以便仅在变量尚未为真时才重新分配已更改的变量?

谢谢!

4

6 回答 6

3

我希望循环继续执行,只要更改是真实的
意思吗?如果两种方法都返回false,你想停止循环吗?如果是,那么做:

boolean changed = true;
boolean changed1 = true;

    while(changed || changed1) {
        changed = foo();
        changed1 = foobar();
    }
于 2011-03-14T05:06:11.033 回答
3

怎么样:

changed = foo() | foobar();

请注意按位或运算符的使用。

于 2011-03-14T05:04:30.207 回答
1

除了按位 OR 选项外,您还可以确保将changed第二个放在表达式中,所有方法都将被执行:

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

我更喜欢按位选项,因为它表明这些方法具有必要的副作用。以上内容应该有据可查,以防止有人稍后出现并“修复它以提高性能”。

于 2011-03-14T05:16:59.267 回答
0

您可以使用以下缩短的代码语法

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

我编辑了答案。感谢大家指出错误:)

于 2011-03-14T05:08:47.583 回答
0

基本上,只要 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() ) {};
于 2011-03-14T05:16:19.840 回答
0

使用 do-while 的一个很好的例子:

boolean changed;    // no initial value needed
do {
    changed = foo() | foobar();  // should not be ||
} while(changed);
于 2011-03-15T13:15:04.360 回答