は"}while(0);"が常に等しい"break;}while(1);"?
-
26-09-2019 - |
質問
いgccアセンブラの出力
do{
//some code
}while(0);
と
do{
//some code
break;
}while(1);
出力は等しい、最適だ..
いつでも可能です。
な実験を証明できる理論でのみその考えは間違ってい
解決
若干の違いがあります:
do {
// code
if ( condition )
continue;
// code
break;
} while(1);
condition
が真であるとき} while(0);
バージョンでは、continue
がbreak
と等価になるのに対し、ループを再起動します。
何continue
が存在しない場合、彼らはまったく同じコードを生成する必要があります。
他のヒント
フォームは等価ではありません。これは無限ループです:
do {
continue;
break;
} while (1);
このではありません。
do {
continue;
} while (0);
の編集の問題に関するさまざまなコメントを読めば、私はこの答えが間違っていることを認めるだろう。申し訳ありません。
の代わりに:
do{
//some code
}while(0);
または
do{
//some code
break;
}while(1);
私はちょうど使用することになります:
//some code
私がいない100%必ずC ++でこれを行うことができればだけど、あなたは、変数の範囲を限定したい、そしてそれはあなたがこれをやっている理由である場合には、単に自分自身で中括弧を使用します:
{
// Some Code
}
パトリシアフィスター'コメントの問題について意見を交わしてこの答え:その違いは利用の場合 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;
}
す 一つだけ 繰り返し、この場合:
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.
の句は、論理的に等価である一方で行います。それらは同じバイトコードに変換されている場合は、手元のコンパイラに依存します。私は最も近代的なコンパイラは同じようにそれらを扱うことを推測ます。
一定の条件が満たされたとき、「ループ」から抜け出すことができるようにするために、あなたは
break
sでしばらく使用していることをあなたのコメントに基づいてます。 EDIT
これはあなたが達成しようとしているものである場合:
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;
}
所属していません StackOverflow