我有一个问题请帮助我
do{
// do some instruction
}while(condition );
很明显可以理解,但是这个
do
{
//again some instruction
}while(0);
我猜不出它是做什么的?它是否等同于这个:做一些事情(假)?或者它是无限循环吗?请帮助我
我有一个问题请帮助我
do{
// do some instruction
}while(condition );
很明显可以理解,但是这个
do
{
//again some instruction
}while(0);
我猜不出它是做什么的?它是否等同于这个:做一些事情(假)?或者它是无限循环吗?请帮助我
它只做一次。它广泛用于宏中对语句进行分组并使用法更自然(即需要以分号结尾)。
任何值得其盐的编译器都应该完全忽略 do .. 而只是运行随附的语句。
虽然这个“循环”只执行一次,但可以这样使用它:
do
{
// declare some local variables only visible here
// do something
if(TestSomeConditions())
break;
// do something more
// destructors of local variables run here automatically
}while(0);
恕我直言,在大多数情况下,最好以更结构化的方式重写它,无论是这种方式
// do something
if(!TestSomeConditions())
{
// do something more
}
或者通过引入一个单独的函数,反映原始范围:
void MyFunction()
{
// declare some local variables only visible here
// do something
if(TestSomeConditions())
return;
// do something more
}
do while 循环首先执行循环体中的所有指令,然后检查条件。因此,这个循环只执行一次循环体的指令。
do
{
//my instructions
}while(0)
相当于写
{
//my instructions
}
现代编译器足够聪明,可以优化这些东西!
它会将 0 视为 false,并且一旦到达 while(g++ 编译器测试),就会执行一次循环并中断。
从技术上讲,它使它运行一次,因为它在运行一次后检查(并且检查失败)。
除此之外,它还用于宏中。例如:
#define blah(a) \
something(1); \
something(2)
if(a)
blah(4);
else
blah(19);
会导致这个:
...
if(a)
something(1); something(2);
else
something(1); something(2);
这是无效的语法,因为 else 不再是 if 语句的一部分。你可以做的是:
define blah(a) \
do {
something(1); something(2);
} while(0)
...
这将转化为 if 块中的单个语句:
if(a)
do { something(1); something(2); } while(0);
else
...