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

为 true时将重新启动循环condition,而在} 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

编辑: 在阅读了关于此事的各种评​​论后,我承认这个答案是错误的。对不起。

代替:

do{ 

//some code 

}while(0);

或者:

do{

//some code

 break; 
}while(1);

我只会使用:

//some code

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

{

 // Some Code

}
于 2010-06-11T14:53:24.153 回答
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;
}

只会得到一次迭代,而在这种情况下:

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 回答
3

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

于 2010-06-11T14:51:22.973 回答
0

根据您对breaks 使用 while 的评论进行编辑,以便在满足某些条件时能够跳出“循环”。

如果这是您要完成的任务:

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 回答