0

両方ともブール値を返すメソッドfoo()とfoobar()があります。結果に関係なく、それぞれを実行する必要があります。

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

変更がtrueである限りループを実行し続けたいのですが、foobar()のifsとelsesの2番目のコードブロックはあまりエレガントではないように感じます。変更された変数がまだ真でない場合にのみ再割り当てされるように、その部分を記述するためのより良い方法はありますか?

ありがとう!

4

6 に答える 6

3

どうですか:

changed = foo() | foobar();

ビット単位または演算子の使用に注意してください。

于 2011-03-14T05:04:30.207 に答える
3


変更が本当の意味である限り、ループを実行し続けたいですか?両方のメソッドがfalseを返した場合にループを停止し、yesの場合は次のようにします。

boolean changed = true;
boolean changed1 = true;

    while(changed || changed1) {
        changed = foo();
        changed1 = foobar();
    }
于 2011-03-14T05:06:11.033 に答える
1

ビット単位のORオプションに加えてchanged、式の2番目を指定すると、すべてのメソッドが実行されることを確認することもできます。

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

メソッドに必要な副作用があることを伝えるので、ビット単位のオプションの方が好きです。上記は、誰かが後でやって来て「パフォーマンスを向上させるために修正する」ことを防ぐために、十分に文書化する必要があります。

于 2011-03-14T05:16:59.267 に答える
0

do-whileを使用するための良いケース:

boolean changed;    // no initial value needed
do {
    changed = foo() | foobar();  // should not be ||
} while(changed);
于 2011-03-15T13:15:04.360 に答える
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 に答える