我已经比较了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);
当condition
为真时,将重新启动循环,而在} while(0);
版本中,continue
将等同于break
。
如果没有continue
存在,则它们应产生完全相同的代码。
do { /*code*/ } while(condition); /*code*/
,至少是这个具体示例。 - ShinTakezoudo {
continue;
break;
} while (1);
这不是:
do {
continue;
} while (0);
编辑:在阅读了许多有关此问题的评论后,我承认我的答案是错误的。抱歉。
改为:
do{
//some code
}while(0);
或者:
do{
//some code
break;
}while(1);
我只会使用:
//some code
{
// Some Code
}
goto
。不开玩笑。使用一个虚假的循环,以便你可以把 goto
伪装成其他单词,比直接使用 goto
更加邪恶。(我个人认为) - CB Baileydo { ... } while 0
的主要用途是在宏中,因为它允许您编写包含多个语句的单个语句。块不完全等同于单个语句,因为{ ... };
是两个语句,而do { ... } while 0;
是一个语句(这很重要:考虑if (foo) bar(); else baz;
)。这在C中大多适用,因为C++有更好的方法来编写函数类型的宏。 - David Thornleycontinue
关键字时。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
的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;
}
do { } while (0)
是写宏的常见惯用语。如果使用不当,它会生成比其他替代方案更多的编译错误...至于带有break
的while(1)
...我不知道为什么会有用处。 - Stephen