是“} while(0);”总是等于“break;} while(1);”?

时间:2010-06-11 14:48:55

标签: c++ c while-loop break do-while

我比较了

的gcc汇编程序输出
do{ 

//some code 

}while(0);

do{

//some code

 break; 
}while(1);

输出相等,有或没有优化但是..

一直都是这样吗?

没有实验可以证明理论,它们只能证明它们是错误的

6 个答案:

答案 0 :(得分:18)

略有不同:

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

condition为真时重启循环,而在} while(0);版本中,continue将等同于break

如果不存在continue,那么它们应该生成完全相同的代码。

答案 1 :(得分:5)

表格不相同。这是一个无限循环:

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

这不是:

do {
    continue;
} while (0);

答案 2 :(得分:4)

编辑:在阅读有关此事的各种评​​论后,我承认这个答案是错误的。遗憾。

而不是:

do{ 

//some code 

}while(0);

或:

do{

//some code

 break; 
}while(1);

我会用:

//some code

我不是100%肯定你是否可以在c ++中这样做,但是如果你想限制变量的范围,那就是你这样做的原因,只需自己使用花括号:

{

 // Some Code

}

答案 3 :(得分:4)

马库斯的评论向我指出了这个答案:区别在于使用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下测试。

答案 4 :(得分:3)

do while子句在逻辑上是等价的。如果它们被翻译成相同的字节代码取决于手头的编译器。我想大多数现代编译器都会平等对待它们。

答案 5 :(得分:0)

根据您对break使用一段时间的评论进行编辑,以便在满足某些条件时能够突破'循环'。

如果这是你想要完成的事情:

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;
}