2

我有一个问题请帮助我

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

很明显可以理解,但是这个

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

我猜不出它是做什么的?它是否等同于这个:做一些事情(假)?或者它是无限循环吗?请帮助我

4

5 回答 5

6

它只做一次。它广泛用于宏中对语句进行分组并使用法更自然(即需要以分号结尾)。

任何值得其盐的编译器都应该完全忽略 do .. 而只是运行随附的语句。

于 2011-10-18T05:54:52.620 回答
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
  }
于 2011-10-18T05:58:41.287 回答
1

do while 循环首先执行循环体中的所有指令,然后检查条件。因此,这个循环只执行一次循环体的指令。

do
{
    //my instructions
}while(0)

相当于写

{
    //my instructions
}

现代编译器足够聪明,可以优化这些东西!

于 2011-10-18T05:57:57.047 回答
1

它会将 0 视为 false,并且一旦到达 while(g++ 编译器测试),就会执行一次循环并中断。

于 2011-10-18T06:00:12.250 回答
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
    ...
于 2011-10-18T06:07:46.820 回答