我有一个问题,请帮助我。我已经在网页上阅读了关于do while语句的内容,不同的是,在写入0时,不是布尔条件
do{
// do some instruction
}while(condition );
显然是可以理解的,但是这个
do
{
//again some instruction
}while(0);
我无法猜测它是做什么的?它是否等同于:做某事(假)?或者可能是无限循环?请帮帮我
答案 0 :(得分:6)
它只做一次。 widely used in macros对语句进行分组并使用法更自然(即需要以分号结尾)。
任何有价值的编译器都应该忽略do ..而只是运行所附的语句。
答案 1 :(得分:3)
虽然这个“循环”只执行一次,但可以这样使用它:
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
}
答案 2 :(得分:1)
do while循环首先执行循环体中的所有指令,然后检查条件。因此,这个循环只执行一次循环体的指令。
do
{
//my instructions
}while(0)
相当于写作
{
//my instructions
}
现代编译器非常聪明,可以优化这些东西!
答案 3 :(得分:1)
它会将0视为false,并且一旦到达while(g ++编译器测试),就会执行和中断一次循环。
答案 4 :(得分:1)
从技术上讲,它运行一次,因为它在运行一次后检查(并且检查失败)。
除此之外,它在宏中使用。例如:
#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
...