我比较了
的gcc汇编程序输出do{
//some code
}while(0);
带
do{
//some code
break;
}while(1);
输出相等,有或没有优化但是..
一直都是这样吗?
没有实验可以证明理论,它们只能证明它们是错误的
答案 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;
}