4

のgccアセンブラ出力を比較しました

do { 

// some code 

} while (0);

do {
 
    // some code

    break; 
} while (1);

最適化の有無にかかわらず、出力は同じですが。

いつもそうですか?

実験は理論を証明することはできません、彼らは彼らが間違っていることを示すことができるだけです

4

6 に答える 6

18

わずかな違いがあります:

do {
  // code
  if ( condition )
    continue;
  // code
  break;
} while(1);

conditiontrueの場合、ループを再開しますが、} while(0);バージョンでは、continueはと同等になりbreakます。

存在しない場合continueは、まったく同じコードを生成する必要があります。

于 2010-06-11T15:04:40.413 に答える
5

フォームは同等ではありません。これは無限ループです。

do {
    continue;
    break;
} while (1);

これはそうではありません:

do {
    continue;
} while (0);
于 2010-06-11T15:05:39.217 に答える
4

Markusのコメントは、私にこの答えを示しました。違いは、continueキーワードを使用する場合です。

この場合:

int _tmain(int argc, _TCHAR* argv[])
{
    int i = 0;
    do {
        ++i;
        _tprintf(_T("Iteration %d\n"), i);
        if (i < 30) continue;
    } while(0);

    return 0;
}

この場合、反復は1回だけです。

int _tmain(int argc, _TCHAR* argv[])
{
    int i = 0;
    do {
        ++i;
        _tprintf(_T("Iteration %d\n"), i);
        if (i < 30) continue;
        break;
    } while(1);

    return 0;
}

30回の反復があります。VS2008でテスト済み。

于 2010-06-11T15:08:50.030 に答える
4

編集: この問題に関するさまざまなコメントを読んだとき、私はこの答えが間違っていることを認めます。ごめん。

それ以外の:

do{ 

//some code 

}while(0);

また:

do{

//some code

 break; 
}while(1);

私はただ使用します:

//some code

これをC++で実行できるかどうかは100%わかりませんが、変数の範囲を制限したい場合は、これを実行する理由として、中括弧を単独で使用してください。

{

 // Some Code

}
于 2010-06-11T14:53:24.153 に答える
3

dowhile句は論理的に同等です。それらが同じバイトコードに変換されるかどうかは、手元のコンパイラに依存します。最近のほとんどのコンパイラはそれらを同等に扱うと思います。

于 2010-06-11T14:51:22.973 に答える
0

break特定の条件が満たされたときに「ループ」から抜け出すことができるように、sでしばらく使用しているというコメントに基づいて編集します。

これがあなたが達成しようとしていることである場合:

do
{ 
  // processing step 1
  if( some_condition )
    break;
  // processing step 2
  if( some_condition )
    break;
  // etcetera..
} while(0)

...次に、whileループ内のコードを分割して、複数の戻り値を持つスタンドアロン関数にループアウトします。

void processing()
{

  // processing step 1
  if( some_condition )
    return;
  // processing step 2
  if( some_condition )
    return;
  // etcetera..
}

int main()
{
  // ...
  processing();
  return 0;
}
于 2010-06-11T14:56:17.847 に答える