0 whileステートメント
-
25-10-2019 - |
質問
私には1つの質問があり、私を助けてください。私は声明の間にWebページについて読んでいます、違うのは、ブールの状態ではなく、書かれている間、
do{
// do some instruction
}while(condition );
明らかに理解できますが、これ
do
{
//again some instruction
}while(0);
私はそれが何をしているのか推測できませんか?それはこれと同等ですか:何かをしながら(偽)?
解決
それは一度だけ何かをします。そうです マクロで広く使用されています 声明をグループ化し、使用法をより自然にするために(つまり、セミコロンを終了する必要があります)。
塩に値するコンパイラは、doを無視する必要があります。
他のヒント
この「ループ」は一度だけ実行されますが、このように使用することができます。
do
{
// declare some local variables only visible here
// do something
if(TestSomeConditions())
break;
// do something more
// destructors of local variables run here automatically
}while(0);
私見、ほとんどの場合、これをより構造化された方法で書き直す方が良いです。
// do something
if(!TestSomeConditions())
{
// do something more
}
または、元の範囲を反映して、個別の関数を導入することにより:
void MyFunction()
{
// declare some local variables only visible here
// do something
if(TestSomeConditions())
return;
// do something more
}
0をfalseとして扱い、1回のループが実行されたらすぐに実行および破損します(G ++コンパイラテスト)。
doは、ループのすべての命令を最初にループのボディのすべての命令を実行し、次に条件をチェックします。したがって、このループは、ループの本体の指示を1回実行するだけです。
do
{
//my instructions
}while(0)
執筆と同等です
{
//my instructions
}
モダンなコンパイラは、これらのことを最適化するのに十分賢いです!
技術的に言えば、1回実行した後にチェック(およびチェックに失敗します)で、1回実行されます。
それ以外は、マクロで使用されています。例えば:
#define blah(a) \
something(1); \
something(2)
if(a)
blah(4);
else
blah(19);
これにつながる:
...
if(a)
something(1); something(2);
else
something(1); something(2);
他の人はもはやIFステートメントの一部ではないため、これは有効な構文ではありません。あなたができることは次のとおりです。
define blah(a) \
do {
something(1); something(2);
} while(0)
...
ifブロックの単一のステートメントに変換されます。
if(a)
do { something(1); something(2); } while(0);
else
...
所属していません StackOverflow