質問

いgccアセンブラの出力

do{ 

//some code 

}while(0);

do{

//some code

 break; 
}while(1);

出力は等しい、最適だ..

いつでも可能です。

な実験を証明できる理論でのみその考えは間違ってい

役に立ちましたか?

解決

若干の違いがあります:

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

conditionが真であるとき} while(0);バージョンでは、continuebreakと等価になるのに対し、ループを再起動します。

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.

の句は、論理的に等価である一方で行います。それらは同じバイトコードに変換されている場合は、手元のコンパイラに依存します。私は最も近代的なコンパイラは同じようにそれらを扱うことを推測ます。

一定の条件が満たされたとき、「ループ」から抜け出すことができるようにするために、あなたはbreaksでしばらく使用していることをあなたのコメントに基づいてます。

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