while语句中为0

时间:2011-10-18 05:52:53

标签: c++ coding-style syntax do-while

我有一个问题,请帮助我。我已经在网页上阅读了关于do while语句的内容,不同的是,在写入0时,不是布尔条件

do{
   // do some instruction
}while(condition );

显然是可以理解的,但是这个

 do
  {
    //again some instruction
  }while(0);

我无法猜测它是做什么的?它是否等同于:做某事(假)?或者可能是无限循环?请帮帮我

5 个答案:

答案 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
    ...