web-dev-qa-db-ja.com

コードは「while(condition);」です。有効で、それはどういう意味ですか?

while(condition);のようなセミコロンをCプログラミングに入れることはできますか? while(condition);が有効な場合、それはどういう意味ですか?

26
user500817
while (condition);

と同じです

while (condition) 
{
}

待機ループに使用できます。例:

while (!isLightGreen()); // waits until isLightGreen() returns true
go();
52
Curd

これは、ループの本体が空であることを意味します。通常、このパターンは、条件自体が何らかの作業を行うときに使用されます。

たとえば、このループは次の条件内でバイトをコピーできます。

while ( '\0' != (*pt++ = *ps++))
            ;

セミコロンを使用している場合は、間違いのように見えないように、セミコロンを別の行に配置することをお勧めします。私は個人的に空の中括弧を使用する傾向があります-{}、そして時々空のブロックが意図的であるというコメント。

編集:

2番目のコメントで、Tom Andersonは、単独のセミコロンよりも改善されていると述べています。 GoogleのC++スタイルガイド これまたは{}のいずれかをお勧めします。

while ( '\0' != (*pt++ = *ps++))
            continue;
27
Andy Thomas

状態には実際に副作用がある可能性があるため、そのような構成は許可されます。次のことを考慮してください。

while (*p && *p++ != ' ');

これにより、pポインタがスペースである最初の文字に進みます。

コンマ演算子を使用して、条件内に通常のステートメントを含めることもできます。

while (do_something(), do_something_else(), i < n);

コンマ演算子で接続されたステートメントは右端のステートメントに評価されるため、その場合はi < n、上記は次と同じです。

do {
  do_something();
  do_something_else();
} while (i < n);
10

はい、できます。これは、whileループがconditionがfalseになるまでループし続けることを意味します。例えば:

#include<stdio.h>

int x = 10;
int func()
{
  printf("%d\n", x);
  return --x;
}

int main()
{
  while(func());
  return 0;
}

しかし、一般的には、ロジックをループの本体に配置する方が理にかなっているため、これは行いません。

編集:

これが使用されている例がいくつかあります。たとえば、nullで終了する文字列をコピーします。

char dest[256];
char *src = "abcdefghijklmnopqrstuvwxyz";
while(*(dest++) = *(src++));
10
Niki Yoshiuchi

Falseになるまで条件を評価し続けます。本体のないループです。

プログラマーは、セミコロンの前にスペースを追加することがよくあります。

while(condition) ;

または空の中括弧:

while(condition) {}

空の体を表示することは意図的なものであり、単なるタイプミスではありません。既存のソースコードを読んでいて、なぜそこに空のループがあるのか​​疑問に思っている場合は、次の数行も読んで、セミコロンが実際にあるかどうかを確認する必要があります(つまり、次の数行はループするかどうか?)。

5
atomice

私はいつもこれを次のように書きます:

while (condition())
    continue;

それが間違いではなかったことは明らかです。他の人が言っているように、それはcondition()に副作用がある場合にのみ意味があります。

4
Darron

はい、それは正しいです。 falseになるまで条件をループします。

while ( condition() );
4
onemasse

これを理解するための鍵は、「C」のwhileループの構文が次のとおりであることです。

while (condition) statement

ここで、ステートメントは任意の有効な「C」ステートメントにすることができます。以下はすべて有効な「C」ですステートメント

{ statements } // a block statement that can group other statements

statement; // a single statement terminated by a ;

; // a null statement terminated by a ;

したがって、whileループの規則により、ステートメント部分(この例ではnullステートメント)は、条件である限り実行(何もしない)します。 =はtrueです。これは、条件falseになるまでビジーウェイトになるので便利です。待つのは良い方法ではありませんが、それでも便利です。たとえば、別のスレッド(またはシグナルハンドラー)が変数をある値に設定するのを待ってから先に進む場合は、この構成を使用できます。

3
Ziffusion

状態をチェックし続けると評価されるまでfalse

3
secmask

コードwhile(condition);は完全に有効なコードですが、その用途はほとんどありません。 conditionは変数であり、関数ではないと思います。ここで他の人が関数conditionについて説明しています。

while(condition);の使用法の1つは、 signal を待っている間にブロックすることです。 SIGHUP 、ここでシグナルハンドラーは変数conditionを変更します。ただし、これは通常、信号を待つための最良の方法ではありません。通常、ループではsleep、つまりwhile(condition) { sleep(1); }を使用します。

sleep がないということは、ループが暫定的に継続的に処理され、処理サイクルが無駄になる可能性があることを意味します。プロセスのリソースが管理されていない限り(そしてそこでも...)、これは、使用可能なsleepコマンドの粒度よりも短い間隔でループを中断する必要がある場合にのみ適していると思います(つまり、sleepは秒単位で細分化されますが、1秒未満の応答時間で実行されたルックの後にコードが必要です)。とは言うものの、パフォーマンスの観点からは、信号よりもブロッキングパイプまたはソケットの方が望ましい場合があります。ただし、それをバックアップするための経験的なデータはなく、プラットフォームによってパフォーマンスが大幅に異なる可能性があります。

1つのcouldは、同じプロセスの並列スレッドによってconditionが変更されていますが、それを行う方がよいと思います。ミューテックスまたはセマフォの(つまり、conditionは単純な変数以上のものである必要がある場合があります)。

それがお役に立てば幸いです、または少なくとも思考の糧です!

3
Brian M. Hunt

while()はループです。あなたはおそらく「do-while」ループを実行しようとしています。 Do-whileループは次の形式で実行されます。

do
{
    // Your process
    // When something goes wrong or you wish to terminate the loop, set condition to 0 or false
} while(condition);

ただし、上記にリストしたものは空のループです。

while()ループはほぼ同じように機能します。単に「行う」部分はありません。

幸運を!

3
RageD

それはただの空のループです。あなたが状態が何であるかを説明するならば、それは助けになるでしょう。

2
Daniel A. White

実行本体のないwhileループ

while(condition);

と同じです

while(condition)
{
    }
1
JoshMachine

それは絶対に正しいです。これは、ループ内で何もせず、条件をポーリングするだけであることを意味します。これは、組み込みシステムのコードでは一般的です。

1
Sim Sun

条件の評価が条件自体に影響を与える値を変更しない場合、while(condition);は空の無限ループです。つまり、終了することはありません(CPU時間を消費する以外は何もしません)。

1
TeaDrivenDev