このループをより良く書く方法は?

c++ loops
このループをより良く書く方法は?

私はこのようなことをするコードを持っています:

while (doorIsLocked()) {
    knockOnDoor();
}
openDoor();

でも丁寧になりたいと思っています 私はこのように書くことができます:

knockOnDoor();
while (doorIsLocked()) {
    knockOnDoor();
}
openDoor();

しかし、私は文を繰り返さないより良いイディオムがあるかどうか疑問に思っています。

  17  0


ベストアンサー

while-do`ループの代わりに do-while`を使用できます:

do {

  knockOnDoor();

} while (doorIsLocked());

openDoor();

「while-do」ループとは異なり、「do-while」は終了条件をチェックする前に本体を1回実行します。

事前テストおよび事後テストのループ

C / C ++ / C#/ Java /その他の「do-while」ループ-単に「do」ステートメントと呼ばれることもありますが、これは「事後テスト」ループとして知られています。繰り返し。 条件が「true」である「while」をループし、「false」になるとすぐに終了します。

Pascalには、「テスト後」ループでもある「繰り返しまで」ループがあります。条件が「false」の間ループし、「true」になるとすぐに終了します。

一方、Fortranの「do-while」ループは「事前テスト」ループです。終了条件は各反復の前にチェックされます。 C / C ++ / Java / C#/他のいくつかでは、「while-do」ループと「for」ループも「事前テスト」ループです。

疑問がある場合は、常に言語リファレンスを確認してください。

43


はい、どうぞ:

while(knockOnDoor(),doorIsLocked());

5


@polygenelubricantsは、これに対する明らかな最良のソリューションをすでに投稿しています。

ただし、場合によっては、ループから条件を完全に削除し、次のようにする方が簡単な場合があります。

for (;;) {
  knockOnDoor();
  if (!doorIsLocked()) { break; }
}

ループ条件の前後に何をするかを完全に制御できるためです。

しかし、「do-while」が必要なことをするときは、間違いなくそれを好む。

3


再帰呼び出しを行うことができます:

void openLockedDoor(){
    knockOnDoor();
    if( doorIsLocked() ){
        return openLockedDoor();
    }
    return openDoor();
}

ただし、上記の「do-while」は同様に機能します(コンパイラーによってはさらに優れています)。

1


待つのを忘れていました…​ノックを続けると失礼にもなります…​最善の方法は次のようにすることです:

#define WAITING_TIME 2000 //2 Seconds are enough waiting time for another knock
while(doorIsLocked()){
knockOnDoor();
//Now wait
Sleep(WAITING_TIME);
}
openDoor();

0


可能な解決策はこれです

for( ; doorIsLocked(); knockDoor() )

しかし、あなたもこれを試すことができます

for( ; doorIsLocked();  ){
    knockDoor();
}

0


タイトルとURLをコピーしました