我比较了 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);
为 true时将重新启动循环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
}
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下测试。
do while 子句在逻辑上是等价的。它们是否被翻译成相同的字节码取决于手头的编译器。我猜大多数现代编译器都会平等对待它们。
根据您对break
s 使用 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;
}