web-dev-qa-db-ja.com

while(true)を使用した単純なdo whileループ

Cプログラムの例では、このようなループに何度も遭遇しました。これらの種類のループは実際には何をしますか?

_do {

    while (...) // Check some condition if it is true.
    { 
        calculation 1
    }

    // Some new condition is checked.

} while(true);
_

while(true);の必要性は何ですか?無限ループに使用されますか?上記のループが実際に行うことを誰かが説明できますか? Cプログラミングは初めてです

10
Dev

これらのループは、永久にループしたいが、ループからの脱出条件が不明な場合に使用されます。 Certiain条件は、ループから抜け出すためのbreakまたはreturnステートメントとともにループ内に設定されます。例えば:

while(true){
    //run this code
    if(condition satisfies)
        break;    //return;
}

これらのループは、ループを停止するための条件を備えた他のwhileループと同じように、whileループの本体にあります。プログラマのロジックに依存するのは、プログラマがやりたいことだけです。

6
Sargam Modak

はい、これは無限ループに使用されます。この場合のベストプラクティスは、条件の外観を壊すことです

do {

    while () //check some condition if it is true
     { 
     calculation 1
    }

    //some  new condition is checked,if condition met then break out of loop


    } while(true);
1
Cris
do {
  // code here
} while(true);

このループは無限に実行され、停止しないと実行時にエラーが発生する可能性があります。これらの種類のループを実行している場合は、ループがどこかの時点で確実に停止するように、必ずbreakステートメントを中に入れてください。

これと同じ

if(condition)
   break;

プログラムが条件がtrueになるポイントに到達すると、do-whileループが自動的に終了し、その後のコードに進みます。

0
krato

Cでは、条件が真である間、すべてのループがループします。したがって、条件内の明示的なtrueは、実際には「trueがtrueである間ループする」ことを意味するため、永久にループします。

このループは無限であり、プログラムがそのようなlopで終了する場合、breakまたはreturn(または場合によっては例外をスロー)のいずれかのステートメントが、そうでなければ、そのようなループは、そのようなプログラムは決して終了しません。

0

無限ループは、停止条件のチェックが前(forwhileのように)にも後(_do{}while_のように)にも実行できない場合に役立ちます。代わりに、永久にループし、コードの途中で条件をチェックしてブレークできます:if(something) break;

0
Bernd Elkemann

時々私達はそれを例えば使用します:

do
     recv(s , &buf, len, flags);
while(true)

winsock windows apiの例。この方法で、ポートからリッスンできます。

0
La VloZ

次のループ間の一般的な差別化要因:

while (condition) {action}
do {action} while (condition)

前者はzero以上の回数のループに使用され、後者はone以上の回数のループに使用されるということです。

つまり、ループの開始時にwhileの条件がチェックされ、do whileの条件が終了時にチェックされます。

多くの場合、開発者がknowについてdo-whileについて書いていないように見えるコードが表示されます。

result = doSomething();
while (result == NOT_FINISHED) {
    result = doSomething();
}

これは次のように書くことができます。

do {
    result = doSomething();
} while (result == NOT_FINISHED);

ただし、条件が常にtrueである特定のケースでは、実際には問題ではありません。次のループは基本的に同等です(実際の場合は1を使用)。

for (;;) { doSomething(); }
for (;;doSomething());

while (1) { doSomething(); }
do { doSomething(); } while (1);

while (doSomething(),1);

BADPAX: doSomething(); goto BADPAX;

最初のforループは、無限ループを実行する正規の方法である可能性が高く、ループの継続条件を省略した場合、それは常にtrueであると想定されます。

2番目のforループは、ループ本体をforステートメントの反復ごとの部分に移動するだけです。

最初のwhileも時々野生で見られますが、do-whileはおそらくあまり見られません。ここでの唯一の違いは、前者はループの上部で永久にチェックし、後者はループの下部で永久にチェックすることです。

最後のwhileループは、Cのコンマ演算子を使用して、おそらく決してすべきではない方法を使用しています:-)

この最後のものは、今日では非常にまれですが、おそらくマシンコードレベルですべてを最適化するものです。

0
paxdiablo