質問

私には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
    ...
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top