のgccアセンブラ出力を比較しました
do {
// some code
} while (0);
と
do {
// some code
break;
} while (1);
最適化の有無にかかわらず、出力は同じですが。
いつもそうですか?
実験は理論を証明することはできません、彼らは彼らが間違っていることを示すことができるだけです
のgccアセンブラ出力を比較しました
do {
// some code
} while (0);
と
do {
// some code
break;
} while (1);
最適化の有無にかかわらず、出力は同じですが。
いつもそうですか?
実験は理論を証明することはできません、彼らは彼らが間違っていることを示すことができるだけです
わずかな違いがあります:
do {
// code
if ( condition )
continue;
// code
break;
} while(1);
conditiontrueの場合、ループを再開しますが、} while(0);バージョンでは、continueはと同等になりbreakます。
存在しない場合continueは、まったく同じコードを生成する必要があります。
フォームは同等ではありません。これは無限ループです。
do {
continue;
break;
} while (1);
これはそうではありません:
do {
continue;
} while (0);
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でテスト済み。
編集: この問題に関するさまざまなコメントを読んだとき、私はこの答えが間違っていることを認めます。ごめん。
それ以外の:
do{
//some code
}while(0);
また:
do{
//some code
break;
}while(1);
私はただ使用します:
//some code
これをC++で実行できるかどうかは100%わかりませんが、変数の範囲を制限したい場合は、これを実行する理由として、中括弧を単独で使用してください。
{
// Some Code
}
dowhile句は論理的に同等です。それらが同じバイトコードに変換されるかどうかは、手元のコンパイラに依存します。最近のほとんどのコンパイラはそれらを同等に扱うと思います。
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;
}